/ Hex Artifact Content
Login

Artifact bd11bf6971789994b4c1972019f16caf6e5ed5a59165d65f0147535aab191703:


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 23 69 66 6e 64 65 66 20  file */.#ifndef 
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
7ee0: 55 52 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20  URRENT.  Bitvec 
7ef0: 2a 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20  *pAllRead;      
7f00: 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65       /* Pages re
7f10: 61 64 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  ad within curren
7f20: 74 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  t CONCURRENT tra
7f30: 6e 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ns. */.#endif.  
7f40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f70: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7f80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7f90: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7fa0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7fb0: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7fd0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7fe0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ff0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
8000: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
8010: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
8020: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
8030: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
8040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8050: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
8060: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
8070: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
8080: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
8090: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
80a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
80b0: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
80c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
80d0: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
80e0: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
80f0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
8100: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
8110: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
8120: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
8130: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
8160: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
8170: 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74  [] */.  u32 iDat
8180: 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20  aVersion;       
8190: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
81a0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
81b0: 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73   content changes
81c0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
81d0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
81e0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
81f0: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
8200: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a  ile changes */..
8210: 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20    int nMmapOut; 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8230: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20   Number of mmap 
8240: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
8250: 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20  outstanding */. 
8260: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8270: 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  zMmap;       /* 
8280: 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20  Desired maximum 
8290: 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50  mmap size */.  P
82a0: 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c  gHdr *pMmapFreel
82b0: 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist;       /* Li
82c0: 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20  st of free mmap 
82d0: 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44  page headers (pD
82e0: 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20  irty) */.  /*.  
82f0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f  ** End of the ro
8300: 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67  utinely-changing
8310: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20   class members. 
8320: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20  ************/.. 
8370: 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20   u16 nExtra;    
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8390: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
83a0: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
83b0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
83c0: 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20  i16 nReserve;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
83e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
83f0: 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20  bytes at end of 
8400: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
8410: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
8420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
8430: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
8440: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
8450: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8470: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
8480: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
8490: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ack */.  int pag
84a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
84b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
84c0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
84d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
84e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
84f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
8500: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
8510: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8520: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
8530: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
8540: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
8550: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
8560: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72   files */.  char
8570: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
8580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
85a0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
85b0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
85c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
85d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
85f0: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
8600: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
8610: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
8620: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
8630: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
8640: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
8650: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
8660: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20  andler */.  int 
8670: 61 53 74 61 74 5b 34 5d 3b 20 20 20 20 20 20 20  aStat[4];       
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8690: 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   cache hits, mis
86a0: 73 65 73 2c 20 77 72 69 74 65 73 2c 20 73 70 69  ses, writes, spi
86b0: 6c 6c 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  lls */.#ifdef SQ
86c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
86d0: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
86e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
86f0: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a  ase pages read *
8700: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8710: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8720: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8730: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
8740: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
8750: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 74   */.  int (*xGet
8760: 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  )(Pager*,Pgno,Db
8770: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20 2f 2a 20  Page**,int); /* 
8780: 52 6f 75 74 69 6e 65 20 74 6f 20 66 65 74 63 68  Routine to fetch
8790: 20 61 20 70 61 74 63 68 20 2a 2f 0a 23 69 66 64   a patch */.#ifd
87a0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
87b0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
87c0: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
87d0: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
87e0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
87f0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8800: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8810: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8820: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8830: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8840: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8850: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
8860: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
8870: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
8880: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
8890: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
88a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
88b0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
88c0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
88d0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
88e0: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
88f0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8900: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8910: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8920: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8930: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8950: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
8960: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
8970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8980: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
8990: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
89a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
89b0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
89c0: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
89d0: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
89e0: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
89f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8a00: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8a10: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8a20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8a30: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8a40: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8a50: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
8a60: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
8a70: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
8a80: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
8a90: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
8aa0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
8ab0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8ac0: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8ad0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8ae0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8af0: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8b00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8b10: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8b20: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8b30: 52 49 54 45 20 32 0a 23 64 65 66 69 6e 65 20 50  RITE 2.#define P
8b40: 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 20  AGER_STAT_SPILL 
8b50: 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  3../*.** The fol
8b60: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8b70: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8b80: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8b90: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8ba0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8bb0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8bc0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8bd0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8be0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8bf0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8c00: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8c10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8c20: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8c30: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8c40: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8c50: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8c60: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8c70: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8c80: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8c90: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8ca0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8cb0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8cc0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8cd0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8ce0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cf0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8d00: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8d10: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8d20: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8d30: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8d40: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8d50: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8d60: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8d70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8d80: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8d90: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8da0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8db0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8dc0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8dd0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8de0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8df0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8e00: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8e10: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8e20: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8e30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8e40: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8e50: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8e60: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8e70: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8e80: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8e90: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8ea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8eb0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8ec0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8ed0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8ee0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8ef0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8f00: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8f10: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8f20: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8f30: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8f40: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8f50: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8f60: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8f70: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8f80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8f90: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8fa0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8fb0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8fc0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8fd0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8fe0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8ff0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
9000: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
9010: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
9020: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
9030: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
9040: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
9050: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9060: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
9070: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
9080: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9090: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
90a0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
90b0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
90c0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
90d0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
90e0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
90f0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
9100: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
9110: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
9120: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
9130: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9140: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
9150: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
9160: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
9170: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
9180: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
9190: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
91a0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
91b0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
91c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
91d0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
91e0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
91f0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
9200: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
9210: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9220: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9230: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9240: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9250: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
9260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9270: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9280: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
9290: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
92a0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
92b0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
92c0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
92d0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
92e0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
92f0: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
9300: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
9310: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9320: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9330: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9340: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9350: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9360: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9370: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9380: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9390: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
93a0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
93b0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
93c0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
93d0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
93e0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
93f0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9400: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
9410: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9420: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9430: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9440: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9450: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9460: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9470: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9480: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9490: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
94a0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
94b0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
94c0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
94d0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
94e0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
94f0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
9500: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
9510: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9520: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9530: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9540: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9550: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9560: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9570: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9580: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9590: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
95a0: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
95b0: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
95c0: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
95d0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
95e0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
95f0: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
9600: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
9610: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9620: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9630: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9640: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9650: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9660: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9680: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9690: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
96a0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
96b0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
96c0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
96d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
96e0: 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
96f0: 41 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  AD./*.** Return 
9700: 74 72 75 65 20 69 66 20 70 61 67 65 20 70 67 6e  true if page pgn
9710: 6f 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  o can be read di
9720: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
9730: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
9740: 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
9750: 61 79 65 72 2e 20 54 68 69 73 20 69 73 20 74 68  ayer. This is th
9760: 65 20 63 61 73 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  e case if:.**.**
9770: 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
9780: 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 0a  e file is open,.
9790: 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
97a0: 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20   no dirty pages 
97b0: 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
97c0: 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 65 73  d.**   * the des
97d0: 69 72 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  ired page is not
97e0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
97f0: 65 20 77 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 69  e wal file..*/.i
9800: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  nt sqlite3PagerD
9810: 69 72 65 63 74 52 65 61 64 4f 6b 28 50 61 67 65  irectReadOk(Page
9820: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
9830: 70 67 6e 6f 29 7b 0a 20 20 69 66 28 20 70 50 61  pgno){.  if( pPa
9840: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
9850: 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
9860: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 43  .  if( sqlite3PC
9870: 61 63 68 65 49 73 44 69 72 74 79 28 70 50 61 67  acheIsDirty(pPag
9880: 65 72 2d 3e 70 50 43 61 63 68 65 29 20 29 20 72  er->pPCache) ) r
9890: 65 74 75 72 6e 20 30 3b 0a 23 69 66 6e 64 65 66  eturn 0;.#ifndef
98a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
98b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
98c0: 57 61 6c 20 29 7b 0a 20 20 20 20 75 33 32 20 69  Wal ){.    u32 i
98d0: 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Read = 0;.    in
98e0: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
98f0: 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
9900: 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
9910: 20 70 67 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a   pgno, &iRead);.
9920: 20 20 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d      return (rc==
9930: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 52 65  SQLITE_OK && iRe
9940: 61 64 3d 3d 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  ad==0);.  }.#end
9950: 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  if.  return 1;.}
9960: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9970: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
9980: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9990: 73 65 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70  seWal(x) ((x)->p
99a0: 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20  Wal!=0).#else.# 
99b0: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
99c0: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
99d0: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
99e0: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
99f0: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9a00: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9a10: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9a20: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9a30: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
9a40: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
9a50: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
9a60: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
9a70: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
9a80: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
9a90: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9aa0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9ab0: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9ac0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9ad0: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9ae0: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9af0: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9b00: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9b10: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9b20: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9b30: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
9b40: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
9b50: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
9b60: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
9b70: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
9b80: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
9b90: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9ba0: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
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 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9bd0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9be0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9bf0: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9c00: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9c10: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9c20: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9c30: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9c40: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
9c50: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9c60: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
9c70: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
9c80: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
9c90: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9ca0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9cb0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9cc0: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9cd0: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9ce0: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9cf0: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9d00: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9d10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9d20: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9d30: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
9d40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
9d50: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
9d60: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
9d70: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9d90: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9da0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9db0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9dc0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9dd0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9de0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9df0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9e00: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9e10: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9e20: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9e30: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9e40: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9e50: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9e70: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9e80: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9e90: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9ea0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9eb0: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9ec0: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9ed0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9ee0: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9ef0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9f00: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9f10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9f20: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9f30: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9f40: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9f50: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9f60: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9f70: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9f80: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9f90: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9fa0: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9fb0: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9fc0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9fd0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9fe0: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9ff0: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
a000: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
a010: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
a020: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
a030: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
a040: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
a050: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
a060: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
a070: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
a080: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
a090: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
a0a0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
a0b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
a0c0: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
a0d0: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
a0e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
a0f0: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
a100: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20   !isOpen(p->fd) 
a110: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a120: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20  ->noSync );.    
a130: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
a140: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a150: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a160: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a170: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a180: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
a190: 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ORY .    );.    
a1a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
a1b0: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
a1c0: 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  & p->eState!=PAG
a1d0: 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61  ER_OPEN );.    a
a1e0: 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
a1f0: 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  al(p)==0 );.  }.
a200: 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43  .  /* If changeC
a210: 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c  ountDone is set,
a220: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a230: 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
a240: 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e   be held.  ** on
a250: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
a260: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a270: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
a280: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
a290: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a2a0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
a2b0: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44  ( p->eLock!=PEND
a2c0: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73  ING_LOCK );..  s
a2d0: 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65  witch( p->eState
a2e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
a2f0: 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61  ER_OPEN:.      a
a300: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
a310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a320: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a330: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a340: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a350: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a360: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a370: 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  )==0 || pPager->
a380: 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
a390: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a3a0: 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a  se PAGER_READER:
a3b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a3c0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a3d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a3e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a3f0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a400: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a410: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  t( p->eLock>=SHA
a420: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
a430: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a440: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a450: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
a460: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a470: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a490: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a4a0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a4b0: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a4c0: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a4d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a4e0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a4f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
a500: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a510: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  OMIT_CONCURRENT.
a520: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a530: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a540: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a550: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c   || pPager->pAll
a560: 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  Read );.#endif. 
a570: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a580: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a590: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a5a0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a5b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a5c0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a5d0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a5f0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a600: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a610: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a620: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a630: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a640: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a650: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a660: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a670: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a680: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a690: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a6a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a6b0: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a6c0: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a6d0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a6e0: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a6f0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a700: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a710: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a720: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a730: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a740: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a750: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a760: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a770: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a780: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a790: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a7a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a7b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a7c0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a7d0: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a7e0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a7f0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a800: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a810: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a820: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a830: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a840: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a850: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a860: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L .             
a870: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a880: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a890: 4d 4f 44 45 5f 57 41 4c 32 0a 20 20 20 20 20 20  MODE_WAL2.      
a8a0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
a8b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a8c0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a8d0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a8e0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a8f0: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a900: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a910: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a920: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a930: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a940: 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  _DBMOD:.      as
a950: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  sert( p->eLock==
a960: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a970: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a980: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a9a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
a9b0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a9c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a9d0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c  ( p->eLock>=EXCL
a9e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a9f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
aa00: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
aa10: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
aa20: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
aa30: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
aa40: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
aa50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aa60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aa70: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
aa80: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
aa90: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aaa0: 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20 20 20 20  LMODE_WAL2.     
aab0: 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
aac0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
aad0: 65 72 69 73 74 69 63 73 28 70 2d 3e 66 64 29 26  eristics(p->fd)&
aae0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
aaf0: 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 20 20 20  CH_ATOMIC).     
ab00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ab10: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
ab20: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
ab30: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
ab40: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
ab50: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
ab60: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
ab70: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
ab80: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
ab90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
aba0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
abb0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
abc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
abd0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
abe0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
abf0: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
ac00: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
ac10: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
ac20: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ac30: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
ac40: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
ac50: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ac60: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
ac70: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
ac80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ac90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
aca0: 4c 32 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L2.           ||
acb0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
acc0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
acd0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
ace0: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
acf0: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
ad00: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
ad10: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
ad20: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
ad30: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
ad40: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
ad50: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
ad60: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
ad70: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
ad80: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
ad90: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
ada0: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
adb0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
adc0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
add0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
ade0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
adf0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
ae00: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
ae10: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
ae20: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
ae30: 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70  >pPCache)>0 || p
ae40: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
ae50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ae60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
ae70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
ae80: 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23  def NDEBUG */..#
ae90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
aea0: 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UG ./*.** Return
aeb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
aec0: 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73  human readable s
aed0: 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69  tring in a stati
aee0: 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74  c buffer.** cont
aef0: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65  aining the state
af00: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
af10: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61  ject passed as a
af20: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  n argument. This
af30: 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20  .** is intended 
af40: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69  to be used withi
af50: 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72  n debuggers. For
af60: 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20   example, as an 
af70: 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74  alternative.** t
af80: 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72  o "print *pPager
af90: 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20  " in gdb:.**.** 
afa0: 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73  (gdb) printf "%s
afb0: 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  ", print_pager_s
afc0: 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2a 0a  tate(pPager).**.
afd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
afe0: 68 61 73 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e  has external lin
aff0: 6b 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  kage in order to
b000: 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70 69 6c   suppress compil
b010: 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a 20 61  er warnings.** a
b020: 62 6f 75 74 20 61 6e 20 75 6e 75 73 65 64 20 66  bout an unused f
b030: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  unction.  It is 
b040: 65 6e 63 6c 6f 73 65 64 20 77 69 74 68 69 6e 20  enclosed within 
b050: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 6e 64  SQLITE_DEBUG and
b060: 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20   so does.** not 
b070: 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c  appear in normal
b080: 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68 61 72   builds..*/.char
b090: 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74   *print_pager_st
b0a0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
b0b0: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65   static char zRe
b0c0: 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69  t[1024];..  sqli
b0d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32  te3_snprintf(102
b0e0: 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22  4, zRet,.      "
b0f0: 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25  Filename:      %
b100: 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74  s\n".      "Stat
b110: 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72  e:         %s er
b120: 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20  rCode=%d\n".    
b130: 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20    "Lock:        
b140: 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c    %s\n".      "L
b150: 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f  ocking mode:  lo
b160: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22  cking_mode=%s\n"
b170: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20  .      "Journal 
b180: 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d  mode:  journal_m
b190: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
b1a0: 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20  "Backing store: 
b1b0: 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44  tempFile=%d memD
b1c0: 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d  b=%d useJournal=
b1d0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75  %d\n".      "Jou
b1e0: 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72  rnal:       jour
b1f0: 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72  nalOff=%lld jour
b200: 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20  nalHdr=%lld\n". 
b210: 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20       "Size:     
b220: 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64       dbsize=%d d
b230: 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46  bOrigSize=%d dbF
b240: 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20  ileSize=%d\n".  
b250: 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61      , p->zFilena
b260: 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53  me.      , p->eS
b270: 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
b280: 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f              ? "O
b290: 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70  PEN" :.        p
b2a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b2b0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
b2c0: 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20  ? "READER" :.   
b2d0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
b2e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
b2f0: 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f  KED   ? "WRITER_
b300: 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20  LOCKED" :.      
b310: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
b320: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
b330: 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43  OD ? "WRITER_CAC
b340: 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20  HEMOD" :.       
b350: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b360: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
b370: 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f    ? "WRITER_DBMO
b380: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
b390: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
b3a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20  ITER_FINISHED ? 
b3b0: 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  "WRITER_FINISHED
b3c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b3d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
b3e0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  OR           ? "
b3f0: 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72  ERROR" : "?error
b400: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
b410: 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  p->errCode.     
b420: 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f   , p->eLock==NO_
b430: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22  LOCK         ? "
b440: 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20  NO_LOCK" :.     
b450: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53     p->eLock==RES
b460: 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22  ERVED_LOCK   ? "
b470: 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20  RESERVED" :.    
b480: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58      p->eLock==EX
b490: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20  CLUSIVE_LOCK  ? 
b4a0: 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20  "EXCLUSIVE" :.  
b4b0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b4c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
b4d0: 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20  ? "SHARED" :.   
b4e0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55       p->eLock==U
b4f0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f  NKNOWN_LOCK    ?
b500: 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65   "UNKNOWN" : "?e
b510: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70  rror?".      , p
b520: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
b530: 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20  ? "exclusive" : 
b540: 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c  "normal".      ,
b550: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b560: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b570: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d  DE_MEMORY   ? "m
b580: 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20  emory" :.       
b590: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b5a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b5b0: 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f  DE_OFF      ? "o
b5c0: 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ff" :.        p-
b5d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b5e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b5f0: 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65  DELETE   ? "dele
b600: 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  te" :.        p-
b610: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b620: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b630: 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73  PERSIST  ? "pers
b640: 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ist" :.        p
b650: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b660: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b670: 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75  _TRUNCATE ? "tru
b680: 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20  ncate" :.       
b690: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b6a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b6b0: 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77  DE_WAL      ? "w
b6c0: 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  al" : "?error?".
b6d0: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b6e0: 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70  tempFile, (int)p
b6f0: 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d  ->memDb, (int)p-
b700: 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
b710: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66    , p->journalOf
b720: 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  f, p->journalHdr
b730: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b740: 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  >dbSize, (int)p-
b750: 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e  >dbOrigSize, (in
b760: 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  t)p->dbFileSize.
b770: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a    );..  return z
b780: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  Ret;.}.#endif../
b790: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
b7a0: 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69  nces to the vari
b7b0: 6f 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73  ous page getters
b7c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67   */.static int g
b7d0: 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67  etPageNormal(Pag
b7e0: 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a  er*,Pgno,DbPage*
b7f0: 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  *,int);.static i
b800: 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28  nt getPageError(
b810: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b820: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53  ge**,int);.#if S
b830: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
b840: 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
b850: 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67   getPageMMap(Pag
b860: 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a  er*,Pgno,DbPage*
b870: 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  *,int);.#endif..
b880: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61  /*.** Set the Pa
b890: 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20  ger.xGet method 
b8a0: 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  for the appropri
b8b0: 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ate routine used
b8c0: 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e   to fetch.** con
b8d0: 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  tent from the pa
b8e0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ger..*/.static v
b8f0: 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74  oid setGetterMet
b900: 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  hod(Pager *pPage
b910: 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
b920: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b930: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b940: 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69  getPageError;.#i
b950: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
b960: 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65  P_SIZE>0.  }else
b970: 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
b980: 61 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c  ager).#ifdef SQL
b990: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
b9a0: 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64   && pPager->xCod
b9b0: 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29  ec==0.#endif.  )
b9c0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47  {.    pPager->xG
b9d0: 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70  et = getPageMMap
b9e0: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
b9f0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
ba00: 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  >0 */.  }else{. 
ba10: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
ba20: 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b  = getPageNormal;
ba30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
ba40: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
ba50: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
ba60: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
ba70: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
ba80: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
ba90: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
baa0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
bab0: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
bac0: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
bad0: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
bae0: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
baf0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
bb00: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
bb10: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bb20: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
bb30: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
bb40: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
bb50: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
bb60: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
bb70: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
bb80: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
bb90: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
bba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bbb0: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
bbc0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
bbd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
bbe0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
bbf0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
bc00: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
bc10: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
bc20: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
bc30: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
bc40: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
bc50: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
bc60: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
bc70: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
bc80: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
bc90: 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c  itvecTestNotNull
bca0: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
bcb0: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
bcc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
bcd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
bce0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
bcf0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
bd00: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
bd10: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
bd20: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
bd30: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
bd40: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
bd50: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
bd60: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
bd70: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
bd80: 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
bd90: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
bda0: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69  ->pgno);.}.#endi
bdb0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
bdc0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
bdd0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
bde0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
bdf0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
be00: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
be10: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
be20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
be30: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
be40: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
be50: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
be60: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
be70: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
be80: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
be90: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
bea0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
beb0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
bec0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
bed0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
bee0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
bef0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
bf00: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
bf10: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
bf20: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
bf30: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
bf40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
bf50: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
bf60: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
bf70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bf80: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
bf90: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
bfa0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
bfb0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
bfc0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
bfd0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
bfe0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
bff0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
c000: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
c010: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
c020: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
c030: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
c040: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c050: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
c060: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
c070: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
c080: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
c090: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
c0a0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
c0b0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
c0c0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
c0d0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
c0e0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
c0f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
c100: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
c110: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
c120: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
c130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
c140: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
c150: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
c160: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
c170: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
c180: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
c190: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
c1a0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
c1b0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
c1c0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
c1d0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
c1e0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
c1f0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
c200: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
c210: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
c220: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
c230: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
c240: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
c250: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c260: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
c270: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
c280: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
c290: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
c2a0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
c2b0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
c2c0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
c2d0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
c2e0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
c2f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c300: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
c310: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c320: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
c330: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
c340: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c350: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
c360: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
c370: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
c380: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
c390: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
c3a0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
c3b0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
c3c0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c3d0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
c3e0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
c3f0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
c400: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
c410: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
c420: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
c430: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
c440: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
c450: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
c460: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
c470: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
c480: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
c490: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
c4a0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
c4b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
c4d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c4e0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
c4f0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
c500: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
c510: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
c520: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
c530: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
c540: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
c550: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
c560: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
c570: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
c580: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
c590: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
c5a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
c5b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
c5c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
c5d0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
c5e0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
c5f0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
c600: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
c610: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
c620: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
c630: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
c640: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
c650: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
c660: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
c670: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
c680: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
c690: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
c6a0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
c6b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c6c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
c6d0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
c6e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
c6f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
c700: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c710: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
c720: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
c730: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
c740: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
c750: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
c760: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
c770: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
c780: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
c790: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
c7a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c7b0: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
c7c0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c7d0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
c7e0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
c7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
c800: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
c810: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
c820: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c830: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c840: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c850: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
c860: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
c870: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
c880: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
c890: 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f  -write or.** ato
c8a0: 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20  mic-batch-write 
c8b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61  optimizations ca
c8c0: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
c8d0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a  his pager. The.*
c8e0: 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
c8f0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c900: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
c910: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
c920: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
c930: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
c940: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
c950: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
c960: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
c970: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
c980: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
c990: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
c9a0: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
c9b0: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
c9c0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
c9d0: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
c9e0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
c9f0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
ca00: 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
ca10: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
ca20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
ca30: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77  urnal .** file w
ca40: 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hen it contains 
ca50: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
ca60: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
ca70: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74  ge..**.** The at
ca80: 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65  omic-batch-write
ca90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
caa0: 6e 20 62 65 20 75 73 65 64 20 69 66 20 4f 73 44  n be used if OsD
cab0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
cac0: 74 69 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e  tics().** return
cad0: 73 20 61 20 76 61 6c 75 65 20 77 69 74 68 20 74  s a value with t
cae0: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
caf0: 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74  BATCH_ATOMIC bit
cb00: 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72   set. -1 is.** r
cb10: 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
cb20: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  case..**.** If n
cb30: 65 69 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74  either optimizat
cb40: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ion can be used,
cb50: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
cb60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  */.static int jr
cb70: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
cb80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
cb90: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
cba0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
cbb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
cbc0: 49 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20  IC_WRITE) \. || 
cbd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
cbe0: 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
cbf0: 49 43 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20  IC_WRITE).  int 
cc00: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc20: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
cc30: 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73  ristics */..  as
cc40: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
cc50: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63  ger->fd) );.  dc
cc60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
cc70: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
cc80: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23  s(pPager->fd);.#
cc90: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
cca0: 52 41 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b  RAMETER(pPager);
ccb0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
ccc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
ccd0: 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
cce0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
ccf0: 62 53 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53  bSize>0 && (dc&S
cd00: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43  QLITE_IOCAP_BATC
cd10: 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20  H_ATOMIC) ){.   
cd20: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
cd30: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
cd40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
cd50: 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20  MIC_WRITE.  {.  
cd60: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20    int nSector = 
cd70: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
cd80: 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
cd90: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
cda0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
cdb0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
cdc0: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
cdd0: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
cde0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
cdf0: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
ce00: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
ce10: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
ce20: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
ce30: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
ce40: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
ce50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ce60: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
ce70: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
ce80: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
ce90: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
cea0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
ceb0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
cec0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
ced0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
cee0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
cef0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
cf00: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
cf10: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
cf20: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
cf30: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
cf40: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
cf50: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
cf60: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
cf70: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
cf80: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
cf90: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
cfa0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
cfb0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
cfc0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
cfd0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
cfe0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
cff0: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
d000: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
d010: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
d020: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
d030: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
d040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
d050: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
d060: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
d070: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
d080: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
d090: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
d0a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
d0b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
d0c0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
d0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
d0e0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
d0f0: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
d100: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
d110: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
d120: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
d130: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
d140: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
d150: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
d160: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
d170: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
d180: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
d190: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
d1a0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
d1b0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
d1c0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
d1d0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
d1e0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
d1f0: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
d200: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
d210: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
d220: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
d230: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
d240: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
d250: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
d260: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
d270: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
d280: 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
d290: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
d2a0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
d2b0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
d2c0: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
d2d0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
d2e0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
d2f0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
d300: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
d310: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
d320: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
d330: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
d340: 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a  set_pagehash(X).
d350: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
d360: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
d370: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
d380: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
d390: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
d3a0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
d3b0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
d3c0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
d3d0: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
d3e0: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
d3f0: 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ead a master jou
d400: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66  rnal file name f
d410: 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20  rom the .** end 
d420: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c  of the file and,
d430: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
d440: 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d  copies it into m
d450: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a  emory supplied .
d460: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
d470: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
d480: 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72  bove writeMaster
d490: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68  Journal() for th
d4a0: 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64  e format.** used
d4b0: 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74   to store a mast
d4c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d4d0: 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20  name at the end 
d4e0: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
d4f0: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  e..**.** zMaster
d500: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
d510: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
d520: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
d530: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
d540: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
d550: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
d560: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
d570: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
d580: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
d590: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
d5a0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d5b0: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
d5c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d5d0: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
d5e0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
d5f0: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
d600: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
d610: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
d620: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
d630: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
d640: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
d650: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
d660: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
d670: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
d680: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
d690: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
d6a0: 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20   present at the 
d6b0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
d6c0: 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  al.** file, then
d6d0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
d6e0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
d6f0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
d700: 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65  ter. A.** nul-te
d710: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
d720: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
d730: 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e   buffer followin
d740: 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  g the master.** 
d750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d760: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  e..**.** If it i
d770: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  s determined tha
d780: 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  t no master jour
d790: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
d7a0: 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61   present .** zMa
d7b0: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
d7c0: 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
d7d0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
d7e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
d7f0: 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69  curs while readi
d800: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
d810: 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c  nal file, an SQL
d820: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
d830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
d840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
d850: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
d860: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
d870: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
d880: 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b  r, u32 nMaster){
d890: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8b0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d8c0: 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20    u32 len;      
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8e0: 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  Length in bytes 
d8f0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
d900: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20  l name */.  i64 
d910: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
d920: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
d930: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
d940: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a   journal file pJ
d950: 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  rnl */.  u32 cks
d960: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
d970: 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73      /* MJ checks
d980: 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  um value read fr
d990: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
d9a0: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
d9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
d9c0: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
d9d0: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
d9e0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
d9f0: 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20  ;   /* A buffer 
da00: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
da10: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d  c header */.  zM
da20: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
da30: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
da40: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
da50: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
da60: 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73  , &szJ)).   || s
da70: 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49  zJ<16.   || SQLI
da80: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
da90: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
daa0: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20  zJ-16, &len)).  
dab0: 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72   || len>=nMaster
dac0: 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d   .   || len>szJ-
dad0: 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  16.   || len==0 
dae0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
daf0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
db00: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
db10: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
db20: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
db30: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
db40: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
db50: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
db60: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
db70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
db80: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
db90: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
dba0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
dbb0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
dbc0: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
dbd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
dbe0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
dbf0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
dc00: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
dc10: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
dc20: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
dc30: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
dc40: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
dc50: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
dc60: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
dc70: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
dc80: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
dc90: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
dca0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
dcb0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
dcc0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
dcd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
dce0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
dcf0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
dd00: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
dd10: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
dd20: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
dd30: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
dd40: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
dd50: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
dd60: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
dd70: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
dd80: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
dd90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dda0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
ddb0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
ddc0: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
ddd0: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
dde0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
ddf0: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
de00: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
de10: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
de20: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
de30: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
de40: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
de50: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
de60: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
de70: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
de80: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
de90: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
dea0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
ded0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
def0: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
df10: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
df60: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
df70: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
df80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
df90: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
dfa0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
dfb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
dfc0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
dfd0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
dfe0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
dff0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
e000: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e010: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e020: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
e030: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
e040: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
e050: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
e060: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
e070: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
e080: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
e090: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
e0a0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
e0b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e0c0: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
e0d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
e0e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
e0f0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
e100: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e110: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
e120: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
e130: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
e140: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
e150: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
e160: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
e170: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
e180: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
e190: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
e1a0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
e1b0: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
e1c0: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
e1d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e1e0: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
e1f0: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
e200: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
e210: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
e220: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
e230: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
e240: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
e250: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
e260: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
e270: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
e280: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
e2a0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
e2b0: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
e2c0: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
e2d0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
e2e0: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
e2f0: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
e300: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
e310: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
e320: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
e330: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
e340: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e350: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
e360: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
e370: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
e380: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
e390: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
e3a0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
e3b0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
e3c0: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
e3d0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
e3e0: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
e3f0: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
e400: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
e410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
e420: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
e430: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
e440: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
e450: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
e460: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
e480: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
e490: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
e4a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
e4b0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
e4c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e4d0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e500: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e510: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e520: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
e530: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
e540: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
e550: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
e560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e570: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
e580: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
e590: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
e5a0: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
e5b0: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
e5c0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
e5d0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
e5e0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
e5f0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
e600: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
e610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e620: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e630: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
e640: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
e650: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
e660: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
e670: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e680: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e690: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
e6a0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
e6b0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
e6c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e6d0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
e6e0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
e6f0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e700: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
e710: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
e720: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
e730: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
e740: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e750: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
e760: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
e770: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
e780: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
e790: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
e7a0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
e7b0: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
e7c0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
e7d0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
e7e0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e7f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e800: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
e810: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
e820: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
e830: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
e840: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
e850: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
e860: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
e870: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
e880: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
e890: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e8a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e8b0: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
e8c0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
e8d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e8e0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
e8f0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
e900: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e910: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
e920: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
e930: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e940: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e950: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
e960: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e980: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
e990: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
e9a0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
e9b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
e9c0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
e9d0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
e9e0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
e9f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
ea00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
ea10: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
ea20: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
ea30: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
ea40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ea50: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
ea60: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
ea70: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
ea80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
ea90: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
eaa0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
eab0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
eac0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
ead0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
eae0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
eaf0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
eb00: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
eb10: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
eb20: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
eb30: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
eb40: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
eb50: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
eb60: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
eb70: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
eb80: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
eb90: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
eba0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
ebb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
ebc0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
ebd0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
ebe0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
ebf0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
ec00: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
ec10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec30: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
ec40: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
ec50: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
ec60: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
ec70: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
ec80: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
ec90: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
eca0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
ecb0: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
ecc0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
ecd0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
ece0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
ed10: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
ed20: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
ed30: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ed60: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
ed70: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
ed80: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
ed90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
eda0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
edb0: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
edc0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
edd0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
ede0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
edf0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
ee00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
ee10: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
ee20: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
ee30: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
ee40: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
ee50: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
ee60: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
ee70: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
ee80: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ee90: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
eea0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
eeb0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
eec0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
eed0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
eee0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
eef0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
ef00: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
ef10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
ef20: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ef30: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
ef40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
ef50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
ef60: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
ef70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ef80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
ef90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
efa0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
efb0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
efc0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
efd0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
efe0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
eff0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
f000: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
f010: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
f020: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
f030: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
f040: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
f050: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
f060: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
f070: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
f080: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
f090: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
f0a0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
f0b0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
f0c0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
f0d0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
f0e0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
f0f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
f100: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
f110: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
f120: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
f130: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
f140: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
f150: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
f160: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
f170: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
f180: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
f190: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f1a0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
f1b0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
f1c0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
f1d0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
f1e0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
f1f0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
f200: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
f210: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
f220: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
f230: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
f240: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
f250: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
f260: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
f270: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
f280: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
f290: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
f2a0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
f2b0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
f2c0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
f2d0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
f2e0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
f2f0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
f300: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
f310: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
f320: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
f330: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
f340: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
f350: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
f360: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
f370: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f380: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
f390: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
f3a0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
f3b0: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
f3c0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
f3d0: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
f3e0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
f3f0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
f400: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
f410: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
f420: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
f430: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
f440: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
f450: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
f460: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
f470: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
f480: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
f490: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
f4a0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f4b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
f4c0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
f4d0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
f4e0: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
f4f0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f500: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
f510: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
f520: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
f530: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
f540: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f550: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
f560: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
f570: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
f580: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
f590: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f5a0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
f5b0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f5c0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
f5d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
f5e0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f5f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f600: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
f610: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
f620: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
f630: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
f640: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
f650: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
f660: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f670: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f680: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
f690: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
f6a0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
f6b0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f6c0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f6d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
f6e0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f6f0: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
f700: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
f710: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
f720: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
f730: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
f740: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
f750: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
f760: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
f770: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
f780: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
f790: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
f7a0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
f7b0: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
f7c0: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
f7d0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
f7e0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
f7f0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
f800: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f810: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
f820: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
f830: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
f840: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
f850: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
f860: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
f870: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
f880: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
f890: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
f8a0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
f8b0: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
f8c0: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
f8d0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
f8e0: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
f8f0: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
f900: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
f910: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
f920: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
f930: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
f940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
f950: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
f960: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
f970: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
f980: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
f990: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
f9a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
f9b0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
f9c0: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
f9d0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
f9e0: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
f9f0: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
fa00: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
fa10: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
fa20: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
fa30: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
fa40: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
fa50: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
fa60: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
fa70: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
fa80: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
fa90: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
faa0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
fab0: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
fac0: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
fad0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
fae0: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
faf0: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
fb00: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
fb10: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
fb20: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
fb30: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
fb40: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
fb50: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
fb60: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
fb70: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
fb80: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
fb90: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
fba0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
fbb0: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
fbc0: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
fbd0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fbe0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
fbf0: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
fc00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
fc10: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
fc20: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
fc30: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
fc40: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
fc50: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
fc60: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
fc70: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
fc80: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
fc90: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
fca0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
fcb0: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
fcc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fcd0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fce0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fcf0: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
fd00: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
fd10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fd20: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
fd30: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
fd40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
fd50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
fd60: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
fd70: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
fd80: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
fd90: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
fda0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
fdb0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
fdc0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
fdd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
fde0: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
fdf0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
fe00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
fe10: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
fe20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fe30: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
fe40: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
fe50: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
fe60: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
fe70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
fe80: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
fe90: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
fea0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
feb0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
fec0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
fed0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
fee0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
fef0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
ff00: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
ff10: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
ff20: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
ff30: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
ff40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
ff50: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
ff60: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
ff70: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
ff80: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
ff90: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
ffa0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
ffb0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
ffc0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
ffd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
ffe0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
fff0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
10000 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
10010 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
10020 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
10030 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
10040 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
10050 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
10060 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
10070 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
10080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
10090 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
100a0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
100b0 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
100c0 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
100d0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
100e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
100f0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
10100 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
10110 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
10120 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10130 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
10140 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
10150 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
10180 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
10190 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
101a0 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
101b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
101c0 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
101d0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
101e0 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
101f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10210 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10220 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
10230 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
10240 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
10250 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
10260 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
10270 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
10280 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
10290 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
102a0 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
102b0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
102c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
102d0 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
102e0 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
102f0 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
10300 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
10310 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
10320 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
10330 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
10340 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10350 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
10360 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
10370 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
10380 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
10390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
103a0 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
103b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
103c0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
103d0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
103e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
103f0 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
10400 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
10410 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
10420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10430 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
10440 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10450 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
10460 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
10470 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
10480 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
10490 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
104a0 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
104b0 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
104c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
104d0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
104e0 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
104f0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
10500 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
10510 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
10520 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
10530 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
10540 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
10550 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
10560 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
10570 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
10580 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
10590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
105a0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
105b0 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
105c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
105d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
105e0 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
105f0 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
10600 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
10610 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
10620 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10630 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
10640 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
10650 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
10660 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
10670 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
10680 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
10690 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
106a0 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
106b0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
106c0 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
106d0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
106e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
106f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10700 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
10710 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
10720 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10730 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10740 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10750 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
10760 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
10770 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10780 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10790 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
107a0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
107b0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
107c0 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
107d0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
107e0 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
107f0 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
10800 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10810 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10820 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
10830 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10850 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
10860 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
10870 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
10880 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
10890 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
108a0 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
108b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
108c0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
108d0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
108e0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
108f0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
10900 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
10910 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10920 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
10930 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10940 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
10950 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
10960 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10970 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10980 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
10990 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
109a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
109b0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
109c0 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
109d0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
109e0 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
109f0 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
10a00 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
10a10 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
10a20 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
10a30 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
10a40 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
10a50 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
10a60 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10a70 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
10a80 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
10a90 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10aa0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
10ab0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
10ac0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
10ad0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
10ae0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
10af0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
10b00 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
10b10 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
10b20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
10b30 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
10b40 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
10b50 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
10b60 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
10b70 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
10b80 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10b90 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
10ba0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
10bb0 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
10bc0 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
10bd0 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
10be0 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
10bf0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
10c00 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
10c10 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
10c20 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
10c30 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10c40 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
10c50 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
10c60 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
10c70 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
10c80 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
10c90 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
10ca0 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
10cb0 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
10cc0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
10cd0 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
10ce0 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
10cf0 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
10d00 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
10d10 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
10d20 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
10d30 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
10d40 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
10d50 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
10d60 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
10d70 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
10d80 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
10d90 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
10da0 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
10db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
10dc0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10de0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10df0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
10e00 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
10e10 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
10e20 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10e30 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
10e40 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
10e50 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
10e60 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
10e70 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
10e80 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
10e90 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
10ea0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
10eb0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10ec0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
10ed0 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
10ee0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
10ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
10f00 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10f10 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
10f20 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
10f30 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
10f40 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
10f50 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
10f60 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
10f70 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
10f80 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
10f90 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
10fa0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
10fb0 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
10fc0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
10fd0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
10fe0 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
10ff0 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
11000 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
11010 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
11020 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
11030 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
11040 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
11050 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
11060 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
11070 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
11080 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
11090 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
110a0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
110b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
110c0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
110d0 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
110e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
110f0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
11100 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
11110 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
11120 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
11130 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
11140 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
11150 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
11160 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
11170 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
11180 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11190 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
111a0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
111b0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
111c0 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
111d0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
111e0 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
111f0 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
11200 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
11210 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
11220 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
11230 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
11240 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
11250 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
11260 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
11270 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
11280 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
11290 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
112a0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
112b0 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
112c0 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
112d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
112e0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
112f0 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
11300 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
11310 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
11320 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
11330 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
11340 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
11350 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
11360 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
11370 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
11380 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
11390 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
113a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
113b0 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
113c0 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
113d0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
113e0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
113f0 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
11400 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
11410 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
11420 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
11430 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
11440 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
11450 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11480 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
11490 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
114a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
114b0 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
114c0 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
114d0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
114e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
114f0 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
11500 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
11510 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
11520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11530 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11540 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
11550 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
11560 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
11570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
11580 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
11590 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
115a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
115b0 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
115c0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
115d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
115e0 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
115f0 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
11600 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
11610 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11620 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
11630 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11640 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
11650 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11660 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
11670 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
11680 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
11690 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
116a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
116b0 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
116c0 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
116d0 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
116e0 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
116f0 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
11700 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
11710 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
11720 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
11730 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
11740 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
11750 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
11760 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
11770 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
11780 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
11790 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
117a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
117b0 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
117c0 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
117d0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
117e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
117f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11800 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
11810 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11820 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11830 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
11840 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
11850 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
11860 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
11870 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
11880 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
11890 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
118a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
118b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
118c0 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
118d0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
118e0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
118f0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
11900 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
11910 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11920 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11930 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
11940 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
11950 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11960 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
11970 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11980 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
11990 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
119a0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
119b0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
119c0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
119d0 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
119e0 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
119f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11a00 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11a10 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11a20 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
11a30 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11a40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11a50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
11a60 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11a90 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
11aa0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
11ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11ad0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
11ae0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
11af0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
11b00 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
11b10 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
11b20 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
11b30 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
11b40 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
11b50 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
11b60 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
11b70 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
11b80 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
11b90 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
11ba0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
11bb0 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
11bc0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
11bd0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
11be0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
11bf0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
11c00 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
11c10 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11c20 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
11c30 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
11c40 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
11c50 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
11c60 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
11c70 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
11c80 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
11c90 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
11ca0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
11cb0 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
11cc0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
11cd0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
11ce0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
11cf0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
11d00 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
11d10 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
11d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
11d30 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
11d40 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
11d50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
11d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11d80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
11d90 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
11da0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
11db0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
11dc0 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
11dd0 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
11de0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11df0 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
11e00 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
11e10 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
11e20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
11e30 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
11e40 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
11e50 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
11e60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
11e70 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11e80 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
11e90 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
11ea0 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
11eb0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
11ec0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11ed0 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11ee0 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11ef0 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11f00 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11f10 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11f20 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11f30 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
11f40 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
11f50 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
11f60 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
11f70 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
11f80 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11f90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11fb0 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11fc0 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11fd0 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ff0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
12000 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
12010 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
12020 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
12030 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
12040 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
12050 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
12060 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
12070 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
12080 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
12090 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
120a0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
120b0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
120c0 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
120d0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
120e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
120f0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
12100 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
12110 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
12120 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
12130 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
12140 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
12150 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
12160 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
12170 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
12180 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
12190 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
121a0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
121b0 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
121c0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
121d0 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
121e0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
121f0 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
12200 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
12210 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
12220 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
12230 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
12240 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
12250 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
12260 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12280 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
12290 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
122a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
122b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
122c0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
122d0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
122e0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
122f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
12300 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
12310 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
12320 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
12330 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
12340 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
12350 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
12360 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
12370 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
12380 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
12390 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
123a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
123b0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
123c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
123d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
123e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
123f0 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a  CONCURRENT./*.**
12400 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
12410 20 61 6c 72 65 61 64 79 2c 20 62 65 67 69 6e 20   already, begin 
12420 72 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61  recording all pa
12430 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ges read from th
12440 65 20 70 61 67 65 72 20 6c 61 79 65 72 0a 2a 2a  e pager layer.**
12450 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
12460 61 79 65 72 20 54 68 69 73 20 69 73 20 75 73 65  ayer This is use
12470 64 20 62 79 20 63 6f 6e 63 75 72 72 65 6e 74 20  d by concurrent 
12480 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 52 65  transactions. Re
12490 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
124a0 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
124b0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
124c0 72 6f 72 20 63 6f 64 65 20 28 53 51 4c 49 54 45  ror code (SQLITE
124d0 5f 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72  _NOMEM) if an er
124e0 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ror.** occurs..*
124f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12500 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72 65 6e  erBeginConcurren
12510 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
12520 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12530 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
12540 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d  ager->pAllRead==
12550 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
12560 3e 70 41 6c 6c 52 65 61 64 20 3d 20 73 71 6c 69  >pAllRead = sqli
12570 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
12580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
12590 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  .    pPager->dbO
125a0 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
125b0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66  ->dbSize;.    if
125c0 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  ( pPager->pAllRe
125d0 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ad==0 ){.      r
125e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
125f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21  turn rc;.}../* !
12610 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12620 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a  MIT_CONCURRENT).
12630 2a 2a 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72  **.** Stop recor
12640 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72  ding all pages r
12650 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
12660 65 72 20 6c 61 79 65 72 20 62 79 20 74 68 65 20  er layer by the 
12670 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20  b-tree layer.** 
12680 61 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79 20  and discard any 
12690 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e  current records.
126a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
126b0 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65  PagerEndConcurre
126c0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
126d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
126e0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
126f0 2d 3e 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70  ->pAllRead);.  p
12700 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20  Pager->pAllRead 
12710 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69  = 0;.}../* !defi
12720 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12730 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
12740 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
12750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
12760 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e 20 46 61   in wal mode. Fa
12770 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
12780 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12790 65 72 49 73 57 61 6c 28 50 61 67 65 72 20 2a 70  erIsWal(Pager *p
127a0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
127b0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30   pPager->pWal!=0
127c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
127d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
127e0 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  RENT */../*.** F
127f0 72 65 65 20 74 68 65 20 50 61 67 65 72 2e 70 49  ree the Pager.pI
12800 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67  nJournal and Pag
12810 65 72 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76  er.pAllRead bitv
12820 65 63 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  ec objects..*/.s
12830 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
12840 46 72 65 65 42 69 74 76 65 63 73 28 50 61 67 65  FreeBitvecs(Page
12850 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
12860 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
12870 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
12880 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
12890 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
128a0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
128b0 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50  EndConcurrent(pP
128c0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
128d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
128e0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
128f0 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12900 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
12910 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
12920 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
12930 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
12940 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
12950 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
12960 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
12970 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
12980 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
12990 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
129a0 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
129b0 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
129c0 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
129d0 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
129e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
129f0 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
12a00 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
12a10 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
12a20 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
12a30 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
12a40 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
12a50 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
12a60 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12a70 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
12a80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12a90 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
12aa0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
12ab0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
12ac0 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
12ad0 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
12ae0 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
12af0 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
12b00 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
12b10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12b20 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
12b30 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
12b40 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
12b50 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
12b60 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
12b70 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
12b80 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
12b90 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
12ba0 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
12bb0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
12bc0 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
12bd0 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
12be0 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
12bf0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
12c00 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
12c10 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
12c20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12c30 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
12c40 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
12c50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
12c60 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
12c70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12c80 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
12c90 0a 0a 20 20 70 61 67 65 72 46 72 65 65 42 69 74  ..  pagerFreeBit
12ca0 76 65 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20  vecs(pPager);.  
12cb0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
12cc0 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
12cd0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
12ce0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
12cf0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
12d00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
12d10 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e      sqlite3WalEn
12d20 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
12d30 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
12d40 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12d50 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
12d70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
12d80 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
12d90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12da0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
12db0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20  r code returned 
12dc0 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  by pagerUnlockDb
12dd0 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  () */.    int iD
12de0 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65  c = isOpen(pPage
12df0 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73  r->fd)?sqlite3Os
12e00 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
12e10 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
12e20 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ):0;..    /* If 
12e30 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12e40 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c  stem support del
12e50 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69  etion of open fi
12e60 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  les, then.    **
12e70 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
12e80 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
12e90 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
12ea0 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77  se lock.  Otherw
12eb0 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68  ise.    ** anoth
12ec0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
12ed0 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
12ee0 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c  delete might del
12ef0 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20  ete the file.   
12f00 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64   ** out from und
12f10 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
12f20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12f30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
12f40 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ORY   & 5)!=1 );
12f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12f60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12f70 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31  OFF      & 5)!=1
12f80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12f90 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12fa0 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29  DE_WAL      & 5)
12fb0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12fc0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12fd0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26  LMODE_DELETE   &
12fe0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12ff0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
13000 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13010 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20  E & 5)==1 );.   
13020 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
13030 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13040 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a  IST  & 5)==1 );.
13050 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20      if( 0==(iDc 
13060 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  & SQLITE_IOCAP_U
13070 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
13080 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21  OPEN).     || 1!
13090 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  =(pPager->journa
130a0 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29  lMode & 5).    )
130b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
130c0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
130d0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
130e0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
130f0 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  is in the ERROR 
13100 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61  state and the ca
13110 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ll to unlock the
13120 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
13130 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74   file fails, set
13140 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
13150 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  k to UNKNOWN_LOC
13160 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  K. See the comme
13170 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  nt.    ** above 
13180 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
13190 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
131a0 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
131b0 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20  of why this.    
131c0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ** is necessary.
131d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
131e0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
131f0 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  Pager, NO_LOCK);
13200 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13210 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13220 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
13230 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  ERROR ){.      p
13240 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55  Pager->eLock = U
13250 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20  NKNOWN_LOCK;.   
13260 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   }..    /* The p
13270 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62  ager state may b
13280 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50  e changed from P
13290 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41  AGER_ERROR to PA
132a0 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20  GER_OPEN here.  
132b0 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65    ** without cle
132c0 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  aring the error 
132d0 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e  code. This is in
132e0 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20  tentional - the 
132f0 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64  error.    ** cod
13300 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64  e is cleared and
13310 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74   the cache reset
13320 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65   in the block be
13330 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
13340 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13350 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65  errCode || pPage
13360 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
13370 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50  _ERROR );.    pP
13380 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
13390 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
133a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
133b0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a  PAGER_OPEN;.  }.
133c0 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65  .  /* If Pager.e
133d0 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
133e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
133f0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
13400 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72  annot be.  ** tr
13410 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
13420 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
13430 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
13440 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
13450 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61  ,.  ** it can sa
13460 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74  fely move back t
13470 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  o PAGER_OPEN sta
13480 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  te. This happens
13490 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f   in both.  ** no
134a0 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69  rmal and exclusi
134b0 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ve-locking mode.
134c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
134d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
134e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
134f0 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
13500 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
13510 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
13520 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  >tempFile==0 ){.
13530 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
13540 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
13550 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
13560 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
13570 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
13580 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
13590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
135a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
135b0 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65   = (isOpen(pPage
135c0 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f  r->jfd) ? PAGER_
135d0 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41  OPEN : PAGER_REA
135e0 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DER);.    }.    
135f0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
13600 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
13610 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
13620 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  fd, 0, 0);.    p
13630 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
13640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13650 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
13660 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
13670 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13680 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
13690 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
136a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
136b0 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aster = 0;.}../*
136c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
136d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
136e0 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72  ever an IOERR or
136f0 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74   FULL error that
13700 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65   requires.** the
13710 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69   pager to transi
13720 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52  tion into the ER
13730 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68  ROR state may ah
13740 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  ve occurred..** 
13750 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
13760 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
13770 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
13780 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
13790 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  nd .** the error
137a0 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
137b0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
137c0 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
137d0 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75  on. The .** valu
137e0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
137f0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
13800 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
13810 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
13820 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
13830 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
13840 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
13850 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
13860 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20  of the.** IOERR 
13870 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70  sub-codes, the p
13880 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20  ager enters the 
13890 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
138a0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
138b0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  * is stored in P
138c0 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68  ager.errCode. Wh
138d0 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65  ile the pager re
138e0 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52  mains in the ERR
138f0 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c  OR state,.** all
13900 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73   major API calls
13910 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69   on the Pager wi
13920 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
13930 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43  eturn Pager.errC
13940 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ode..**.** The E
13950 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63  RROR state indic
13960 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
13970 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13980 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
13990 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
139a0 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
139b0 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
139c0 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
139d0 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
139e0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
139f0 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
13a00 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
13a10 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
13a20 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
13a30 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
13a40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
13a50 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
13a60 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
13a70 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
13a80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
13aa0 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
13ab0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
13ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13ad0 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
13ae0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
13af0 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
13b00 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
13b10 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
13b20 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
13b30 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
13b40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
13b50 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
13b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
13b70 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
13b80 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
13b90 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
13ba0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
13bb0 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
13bc0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
13bd0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
13be0 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
13bf0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
13c00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
13c10 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52  te = PAGER_ERROR
13c20 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d  ;.    setGetterM
13c30 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20  ethod(pPager);. 
13c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
13c50 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
13c60 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
13c70 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
13c80 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20   nPage);../*.** 
13c90 54 68 65 20 77 72 69 74 65 20 74 72 61 6e 73 61  The write transa
13ca0 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50  ction open on pP
13cb0 61 67 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f  ager is being co
13cc0 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74  mmitted (bCommit
13cd0 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65  ==1).** or rolle
13ce0 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d  d back (bCommit=
13cf0 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  =0)..**.** Retur
13d00 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e  n TRUE if and on
13d10 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20  ly if all dirty 
13d20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  pages should be 
13d30 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
13d40 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a  .**.** Rules:.**
13d50 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e  .**   *  For non
13d60 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c  -TEMP databases,
13d70 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20   always sync to 
13d80 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  disk.  This is n
13d90 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20  ecessary.**     
13da0 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   for transaction
13db0 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e  s to be durable.
13dc0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63  .**.**   *  Sync
13dd0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f   TEMP database o
13de0 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20  nly on a COMMIT 
13df0 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29  (not a ROLLBACK)
13e00 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e   when the backin
13e10 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68  g.**      file h
13e20 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
13e30 61 6c 72 65 61 64 79 20 28 76 69 61 20 61 20 73  already (via a s
13e40 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72  pill on pagerStr
13e50 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20  ess()) and.**   
13e60 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62     when the numb
13e70 65 72 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  er of dirty page
13e80 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65  s in memory exce
13e90 65 64 73 20 32 35 25 20 6f 66 20 74 68 65 20 74  eds 25% of the t
13ea0 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63  otal.**      cac
13eb0 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  he size..*/.stat
13ec0 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73  ic int pagerFlus
13ed0 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  hOnCommit(Pager 
13ee0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f  *pPager, int bCo
13ef0 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61  mmit){.  if( pPa
13f00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
13f10 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
13f20 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65  f( !bCommit ) re
13f30 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69  turn 0;.  if( !i
13f40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
13f50 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
13f60 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50  return (sqlite3P
13f70 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72 74  CachePercentDirt
13f80 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
13f90 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e)>=25);.}../*.*
13fa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
13fb0 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
13fc0 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  n. A transaction
13fd0 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65   is usually ende
13fe0 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20  d by .** either 
13ff0 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
14000 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e  LLBACK operation
14010 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
14020 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a  ay be called .**
14030 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20   after rollback 
14040 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
14050 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
14060 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
14070 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75  ening.** the jou
14080 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  rnal file or wri
14090 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69  ting the very fi
140a0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
140b0 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62  er of a.** datab
140c0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ase transaction.
140d0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
140e0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
140f0 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52  lled in PAGER_ER
14100 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74  ROR state. If it
14110 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e   is called.** in
14120 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50   PAGER_NONE or P
14130 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
14140 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68  e and the lock h
14150 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65  eld is less.** e
14160 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20  xclusive than a 
14170 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69  RESERVED lock, i
14180 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
14190 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
141a0 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  ny active savepo
141b0 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65  ints are release
141c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
141d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
141e0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73  open, then it is
141f0 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e   "finalized". On
14200 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ce a journal .**
14210 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66   file has been f
14220 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e  inalized it is n
14230 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
14240 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61  se it to roll ba
14250 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63  ck a .** transac
14260 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69  tion. Nor will i
14270 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  t be considered 
14280 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72  to be a hot-jour
14290 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f  nal by this.** o
142a0 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  r any other data
142b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
142c0 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a   Exactly how a j
142d0 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
142e0 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f  zed.** depends o
142f0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
14300 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
14310 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
14320 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74  ve mode and.** t
14330 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e  he current journ
14340 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a  al-mode (Pager.j
14350 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65  ournalMode value
14360 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ), as follows:.*
14370 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
14380 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  de==MEMORY.**   
14390 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64    Journal file d
143a0 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d  escriptor is sim
143b0 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  ply closed. This
143c0 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a   destroys an .**
143d0 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a       in-memory j
143e0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20  ournal..**.**   
143f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55  journalMode==TRU
14400 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75  NCATE.**     Jou
14410 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75  rnal file is tru
14420 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62  ncated to zero b
14430 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
14440 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
14450 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  e==PERSIST.**   
14460 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62    The first 28 b
14470 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
14480 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72  nal file are zer
14490 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69  oed. This invali
144a0 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65  dates.**     the
144b0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
144c0 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c  eader in the fil
144d0 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  e, and hence the
144e0 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a   entire journal.
144f0 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20  **     file. An 
14500 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  invalid journal 
14510 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  file cannot be r
14520 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
14530 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
14540 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54  =DELETE.**     T
14550 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14560 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  is closed and de
14570 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  leted using sqli
14580 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
14590 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20  *.**     If the 
145a0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
145b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
145c0 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20  de, this method 
145d0 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a  of finalizing.**
145e0 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
145f0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75   file is never u
14600 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66  sed. Instead, if
14610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65   the journalMode
14620 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54   is.**     DELET
14630 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  E and the pager 
14640 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
14650 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64  mode, the method
14660 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
14670 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d  .**     journalM
14680 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20  ode==PERSIST is 
14690 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
146a0 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f  .** After the jo
146b0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
146c0 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f  ed, the pager mo
146d0 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41  ves to PAGER_REA
146e0 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66  DER state..** If
146f0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
14700 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61  exclusive rollba
14710 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ck mode, the loc
14720 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73  k on the file is
14730 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20   .** downgraded 
14740 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b  to a SHARED_LOCK
14750 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
14760 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
14770 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
14780 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
14790 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
147a0 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
147b0 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
147c0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
147d0 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
147e0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
147f0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
14800 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
14810 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
14820 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
14830 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
14840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14850 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
14860 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
14870 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
14880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14890 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
148a0 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
148b0 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
148c0 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
148d0 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
148e0 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
148f0 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
14900 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
14910 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
14920 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
14930 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
14940 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
14950 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
14960 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
14970 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
14980 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43  asMaster, int bC
14990 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63  ommit){.  int rc
149a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
149b0 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
149c0 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
149d0 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
149e0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
149f0 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
14a00 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
14a10 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
14a20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
14a30 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  /..  /* Do nothi
14a40 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ng if the pager 
14a50 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
14a60 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
14a70 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20  saction.  ** or 
14a80 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
14a90 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66  VED lock. This f
14aa0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
14ab0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
14ac0 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74  .  ** is no writ
14ad0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
14ae0 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52  tive but a RESER
14af0 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
14b00 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64  ock is.  ** held
14b10 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75   under two circu
14b20 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20  mstances:.  **. 
14b30 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61   **   1. After a
14b40 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d   successful hot-
14b50 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
14b60 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77  , it is called w
14b70 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53  ith.  **      eS
14b80 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
14b90 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
14ba0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a  USIVE_LOCK..  **
14bb0 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20  .  **   2. If a 
14bc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
14bd0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
14be0 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61  lusive holding a
14bf0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a  n EXCLUSIVE .  *
14c00 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74  *      lock swit
14c10 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63  ches back to loc
14c20 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
14c30 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74   and then execut
14c40 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72  es a.  **      r
14c50 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ead-transaction,
14c60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14c70 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53  s called with eS
14c80 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
14c90 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e  ER .  **      an
14ca0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
14cb0 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  VE_LOCK when the
14cc0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
14cd0 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a  n is closed..  *
14ce0 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  /.  assert( asse
14cf0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
14d00 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
14d10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
14d20 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
14d30 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14d40 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
14d50 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70  ITER_LOCKED && p
14d60 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53  Pager->eLock<RES
14d70 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
14d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14d90 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61  OK;.  }..  relea
14da0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
14db0 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
14dc0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
14dd0 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
14de0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
14df0 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74  .      || (sqlit
14e00 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
14e10 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
14e20 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
14e30 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29  AP_BATCH_ATOMIC)
14e40 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  .  );.  if( isOp
14e50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
14e60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
14e70 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14e80 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
14e90 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
14ea0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
14eb0 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
14ec0 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
14ed0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
14ee0 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
14ef0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14f00 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14f10 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
14f20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14f30 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14f40 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
14f50 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14f60 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14f70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
14f80 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
14f90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14fa0 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
14fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14fc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14fd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14fe0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
14ff0 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
15000 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15020 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
15030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
15040 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
15050 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
15060 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
15070 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
15080 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
15090 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
150a0 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
150b0 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
150c0 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
150d0 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
150e0 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
150f0 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
15100 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
15110 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
15120 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
15130 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
15140 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
15150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
15160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
15170 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
15180 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
15190 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
151a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
151b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
151c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
151d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
151e0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
151f0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
15200 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
15210 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
15220 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
15230 72 6e 61 6c 4d 6f 64 65 3c 50 41 47 45 52 5f 4a  rnalMode<PAGER_J
15240 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
15250 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
15260 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
15270 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
15280 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
15290 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
152a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
152b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
152c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
152d0 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
152e0 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
152f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
15300 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
15310 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
15320 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
15330 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
15340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
15350 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
15360 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
15370 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
15380 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
15390 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
153a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
153b0 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
153c0 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
153d0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
153e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
153f0 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
15400 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
15410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15420 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
15430 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
15440 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
15450 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
15460 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
15470 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
15480 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
15490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
154a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
154b0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
154c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
154d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
154e0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
154f0 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20  MODE_WAL.       
15500 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
15510 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
15520 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
15530 4c 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L2.      );.    
15540 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
15550 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
15560 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
15570 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15580 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
15590 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
155a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
155b0 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
155c0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
155d0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
155e0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
155f0 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
15600 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
15610 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
15620 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
15630 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
15640 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
15650 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
15660 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
15670 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
15680 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  gHdr *p = sqlite
15690 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
156a0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
156b0 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
156c0 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
156d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
156e0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
156f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15700 0a 0a 20 20 70 61 67 65 72 46 72 65 65 42 69 74  ..  pagerFreeBit
15710 76 65 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20  vecs(pPager);.  
15720 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
15730 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15750 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72 46   MEMDB || pagerF
15760 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61  lushOnCommit(pPa
15770 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b  ger, bCommit) ){
15780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
15790 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
157a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
157b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
157c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
157d0 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67 65  arWritable(pPage
157e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
157f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
15800 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
15810 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
15820 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
15830 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
15840 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
15850 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
15860 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
15870 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
15880 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15890 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
158a0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
158b0 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
158c0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
158d0 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
158e0 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
158f0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
15900 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
15910 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
15920 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
15930 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
15940 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
15950 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
15960 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
15970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15980 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
15990 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
159a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
159b0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
159c0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
159d0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
159e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
159f0 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
15a00 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
15a10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15a20 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
15a30 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
15a40 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
15a50 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
15a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
15a70 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
15a80 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
15a90 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
15aa0 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
15ab0 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
15ac0 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
15ad0 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
15ae0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
15af0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
15b00 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
15b10 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
15b20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
15b30 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
15b40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
15b50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
15b60 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
15b70 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
15b80 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
15b90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15ba0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
15bb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
15bc0 6d 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  mit ){.    rc = 
15bd0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15be0 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
15bf0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
15c00 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20 30  MMIT_PHASETWO, 0
15c10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15c20 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
15c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
15c50 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
15c60 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65  de .   && (!page
15c70 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
15c80 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  || sqlite3WalExc
15c90 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
15ca0 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29  r->pWal, 0)).  )
15cb0 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  {.    rc2 = page
15cc0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
15cd0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
15ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
15cf0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
15d00 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65  .  }.  pPager->e
15d10 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
15d20 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ADER;.  pPager->
15d30 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  setMaster = 0;..
15d40 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
15d50 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
15d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
15d70 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
15d80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
15d90 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
15da0 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
15db0 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
15dc0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
15dd0 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
15de0 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15df0 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
15e00 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
15e10 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
15e20 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
15e30 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
15e40 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
15e50 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
15e60 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
15e70 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
15e80 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
15e90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15ea0 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67  and move the pag
15eb0 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  er back to OPEN 
15ec0 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a  state. If this .
15ed0 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
15ee0 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
15ef0 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
15f00 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
15f10 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65  e next .** conne
15f20 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
15f30 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
15f40 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
15f50 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
15f60 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c  e) .** will roll
15f70 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
15f80 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
15f90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
15fa0 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15fb0 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
15fc0 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
15fd0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15fe0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
15ff0 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
16000 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
16010 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
16020 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
16030 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
16040 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
16050 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
16060 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
16070 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
16080 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
16090 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
160a0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
160b0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
160c0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
160d0 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e  RROR && pPager->
160e0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
160f0 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EN ){.    assert
16100 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
16110 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
16120 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16130 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
16140 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
16150 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
16160 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
16170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
16180 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
16190 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
161a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
161b0 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c();.    }else i
161c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
161d0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
161e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
161f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16200 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20  _READER );.     
16210 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
16220 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
16230 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
16240 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
16250 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
16260 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
16270 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
16280 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
16290 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
162a0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
162b0 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
162c0 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
162d0 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
162e0 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
162f0 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
16300 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
16310 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
16320 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
16330 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
16340 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
16350 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
16360 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
16370 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
16380 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
16390 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
163a0 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
163b0 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
163c0 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
163d0 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
163e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
163f0 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
16400 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
16410 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
16420 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
16430 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
16440 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
16450 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
16460 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
16470 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
16480 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
16490 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
164a0 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
164b0 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
164c0 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
164d0 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
164e0 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
164f0 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
16500 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
16510 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
16520 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
16530 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
16540 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
16550 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
16560 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
16570 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
16580 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
16590 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
165a0 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
165b0 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
165c0 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
165d0 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
165e0 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
165f0 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
16600 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
16610 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
16620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16630 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
16640 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
16650 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
16660 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
16670 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
16680 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
16690 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
166a0 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
166b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
166c0 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
166d0 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
166e0 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
166f0 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
16700 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
16710 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
16720 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
16730 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
16740 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16750 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
16760 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
16770 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16780 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
16790 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
167a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
167b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
167c0 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
167d0 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
167e0 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
167f0 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
16800 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
16830 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
16840 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
16850 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
16860 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
16870 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
16880 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
16890 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
168a0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
168b0 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  DEC./*.** Make s
168c0 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
168d0 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
168e0 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74  is the same in t
168f0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a  he destination.*
16900 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69 73  * pager as it is
16910 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 20   in the source. 
16920 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20 77   This comes up w
16930 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68 61  hen a VACUUM cha
16940 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  nges the.** numb
16950 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16960 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74 69  its to the "opti
16970 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a  mal" amount..*/.
16980 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
16990 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50 61  rAlignReserve(Pa
169a0 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67 65  ger *pDest, Page
169b0 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28 20  r *pSrc){.  if( 
169c0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 21  pDest->nReserve!
169d0 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 20  =pSrc->nReserve 
169e0 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 52  ){.    pDest->nR
169f0 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e  eserve = pSrc->n
16a00 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
16a10 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44 65  erReportSize(pDe
16a20 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  st);.  }.}.#endi
16a30 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
16a40 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
16a50 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
16a60 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
16a70 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
16a80 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
16a90 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
16aa0 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
16ab0 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
16ac0 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
16ad0 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
16ae0 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
16af0 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
16b00 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
16b10 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
16b20 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
16b30 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
16b40 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
16b50 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
16b60 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
16b70 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
16b80 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
16b90 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
16ba0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
16bb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
16bc0 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
16bd0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16be0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
16bf0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
16c00 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
16c10 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
16c20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
16c30 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
16c40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16c50 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
16c60 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
16c70 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
16c80 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
16c90 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
16ca0 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
16cb0 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
16cc0 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
16cd0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16ce0 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
16cf0 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
16d00 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
16d10 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
16d20 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
16d30 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16d40 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
16d50 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
16d60 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
16d70 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
16d80 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
16d90 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
16da0 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
16db0 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16dc0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16dd0 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
16de0 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
16df0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16e00 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
16e10 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
16e20 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
16e30 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
16e40 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
16e50 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
16e60 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
16e70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
16e80 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
16e90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16ea0 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
16eb0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16ec0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16ed0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
16ee0 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
16ef0 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
16f00 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
16f10 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
16f20 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
16f30 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
16f40 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
16f50 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
16f60 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
16f70 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
16f80 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
16f90 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
16fa0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
16fb0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
16fc0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16fd0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
16fe0 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
16ff0 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
17000 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
17010 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
17020 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
17030 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
17040 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
17050 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
17060 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
17070 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
17080 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
17090 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
170a0 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
170b0 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
170c0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
170d0 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
170e0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
170f0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
17100 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
17110 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
17120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17130 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
17140 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
17150 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
17160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17170 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
17180 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
17190 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
171a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
171b0 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
171c0 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
171d0 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
171f0 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
17200 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
17210 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
17220 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
17230 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
17240 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
17250 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
17260 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
17270 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
17280 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
17290 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
172a0 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
172b0 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
172c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
172d0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
172e0 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
172f0 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
17300 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
17310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
17320 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
17330 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
17340 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
17370 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
17380 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
17390 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
173a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
173b0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
173c0 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
173d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
173e0 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
173f0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
17400 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
17410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
17420 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17440 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
17450 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
17460 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17470 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
17480 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61   The jrnlEnc fla
17490 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f 75  g is true if Jou
174a0 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75 6c  rnal pages shoul
174b0 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f  d be passed thro
174c0 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  ugh.  ** the cod
174d0 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73 65  ec.  It is false
174e0 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d   for pure in-mem
174f0 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ory journals. */
17500 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e  .  const int jrn
17510 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72  lEnc = (isMainJr
17520 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  nl || pPager->su
17530 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a  bjInMemory==0);.
17540 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
17550 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
17560 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
17570 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
17580 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
17590 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
175a0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
175b0 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
175c0 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
175d0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
175e0 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
175f0 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
17600 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
17610 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
17620 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
17630 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
17640 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
17650 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
17660 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
17670 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
17680 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
17690 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
176a0 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
176b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
176c0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
176d0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
176e0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
176f0 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
17700 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
17710 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
17720 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
17730 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
17740 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
17750 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
17760 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
17770 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
17780 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
17790 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
177a0 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
177b0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
177c0 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
177d0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
177e0 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
177f0 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
17800 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
17810 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17820 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
17830 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
17840 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
17850 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
17860 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17870 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17880 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
17890 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
178a0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
178b0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
178c0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
178d0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
178e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
178f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17900 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17910 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17920 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
17930 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
17940 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
17950 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
17960 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
17970 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
17980 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
17990 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
179a0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
179b0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
179c0 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
179d0 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
179e0 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
179f0 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
17a00 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
17a10 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
17a20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17a30 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17a40 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
17a50 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
17a60 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17a70 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
17a80 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
17a90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17aa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
17ab0 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
17ac0 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
17ad0 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
17ae0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
17af0 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
17b00 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
17b10 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
17b20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
17b30 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
17b40 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
17b50 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
17b60 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
17b70 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
17b80 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
17b90 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
17ba0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
17bb0 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
17bc0 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
17bd0 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
17be0 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
17bf0 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
17c00 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
17c10 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
17c20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
17c30 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
17c40 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
17c50 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
17c60 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
17c70 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
17c80 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
17c90 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
17ca0 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
17cb0 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
17cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17cd0 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
17ce0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
17cf0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17d00 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
17d10 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
17d20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17d30 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
17d40 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
17d50 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
17d60 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
17d70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17d80 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
17d90 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
17da0 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
17db0 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
17dc0 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e  ack before durin
17dd0 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
17de0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
17df0 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
17e00 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
17e10 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
17e20 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
17e30 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
17e40 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
17e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17e70 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
17e80 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
17e90 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
17ea0 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
17eb0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
17ec0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
17ed0 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
17ee0 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
17ef0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
17f00 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
17f10 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
17f20 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
17f30 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
17f40 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
17f50 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
17f60 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
17f70 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
17f80 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
17f90 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
17fa0 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
17fb0 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
17fc0 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
17fd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17fe0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
17ff0 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
18000 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
18010 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
18020 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
18030 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
18040 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
18050 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
18060 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
18070 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
18080 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
18090 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
180a0 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
180b0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
180c0 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
180d0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
180e0 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
180f0 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
18100 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
18110 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
18120 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
18130 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
18140 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
18150 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
18160 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
18170 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
18180 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
18190 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
181a0 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
181b0 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
181c0 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
181d0 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
181e0 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
181f0 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
18200 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
18210 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
18220 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
18230 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
18240 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
18250 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
18260 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
18270 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
18280 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
18290 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
182a0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
182b0 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
182c0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
182d0 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
182e0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
182f0 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
18300 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
18310 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
18320 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
18330 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
18340 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
18350 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
18360 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18370 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
18380 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
18390 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
183a0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
183b0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
183c0 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
183d0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
183e0 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
183f0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
18400 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
18410 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
18420 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
18430 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
18440 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
18450 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
18460 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
18470 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
18480 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
18490 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
184a0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
184b0 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
184c0 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
184d0 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
184e0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
184f0 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
18500 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
18510 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18520 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
18530 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
18540 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
18550 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
18560 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
18570 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
18580 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
18590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
185a0 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
185b0 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
185c0 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
185d0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
185e0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
185f0 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
18600 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
18610 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
18620 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
18630 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
18640 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
18650 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
18660 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
18670 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
18680 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
18690 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
186a0 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
186b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
186c0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
186d0 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
186e0 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
186f0 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
18700 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
18710 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
18720 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
18730 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
18740 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
18750 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
18760 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
18770 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
18780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
18790 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
187a0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
187b0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
187c0 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
187d0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
187e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
187f0 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
18800 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
18810 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47  empFile );.  PAG
18820 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
18830 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
18840 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
18850 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
18860 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
18870 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
18880 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
18890 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
188a0 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
188b0 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
188c0 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
188d0 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
188e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
188f0 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
18900 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
18910 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
18920 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
18930 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18940 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
18950 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
18960 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
18970 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
18980 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18990 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
189a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
189b0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
189c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
189d0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
189e0 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
189f0 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
18a00 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
18a10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18a20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18a30 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
18a40 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
18a50 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
18a60 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
18a70 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
18a80 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
18a90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18aa0 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 20   data read from 
18ab0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
18ac0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18ad0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
18ae0 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
18af0 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61 6e  safe even for an
18b00 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
18b10 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61 74  ase - as the dat
18b20 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 63  a.    ** was enc
18b30 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69 74  rypted before it
18b40 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
18b50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18b60 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
18b70 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 65      ** is if the
18b80 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20 72   data was just r
18b90 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ead from an in-m
18ba0 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
18bb0 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20 2a  l. In that.    *
18bc0 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20 62  * case it must b
18bd0 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72 65  e encrypted here
18be0 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63 6f   before it is co
18bf0 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61  pied into the da
18c00 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18c10 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  le.  */.#ifdef S
18c20 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18c30 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63      if( !jrnlEnc
18c40 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 32   ){.      CODEC2
18c50 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
18c60 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
18c70 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61  TE_NOMEM_BKPT, a
18c80 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63 20  Data);.      rc 
18c90 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
18ca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
18cb0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
18cc0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18cd0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
18ce0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
18cf0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18d00 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18d10 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
18d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18d30 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
18d40 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
18d50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18d60 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69  e, ofst);..    i
18d70 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
18d80 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
18d90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
18da0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
18db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18dc0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
18dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
18de0 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69 66  S_CODEC.      if
18df0 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20  ( jrnlEnc ){.   
18e00 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
18e10 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18e20 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18e30 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
18e40 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
18e50 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
18e60 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
18e70 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
18e80 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
18e90 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
18ea0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18eb0 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20  M_BKPT,aData);. 
18ec0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
18ed0 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  f.      sqlite3B
18ee0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18ef0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
18f00 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
18f10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18f20 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
18f30 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
18f40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
18f50 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
18f60 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
18f70 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
18f80 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
18f90 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
18fa0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
18fb0 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
18fc0 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
18fd0 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
18fe0 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
18ff0 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
19000 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
19010 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
19020 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
19030 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
19040 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
19050 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
19060 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
19070 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
19080 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
19090 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
190a0 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
190b0 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
190c0 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
190d0 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
190e0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
190f0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
19100 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
19110 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
19120 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
19130 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
19140 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
19150 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
19160 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
19170 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
19180 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
19190 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
191a0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
191b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
191c0 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
191d0 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
191e0 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
191f0 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
19200 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
19210 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
19220 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
19230 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
19240 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
19250 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
19260 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
19270 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
19280 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
19290 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
192a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
192b0 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
192c0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
192d0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
192e0 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
192f0 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)==0 );.    p
19300 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
19310 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52  l |= SPILLFLAG_R
19320 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20  OLLBACK;.    rc 
19330 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
19340 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
19350 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
19360 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
19370 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
19380 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
19390 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
193a0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
193b0 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
193c0 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
193d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
193e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
193f0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
19400 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
19410 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
19420 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
19430 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
19440 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
19450 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
19460 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
19470 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
19480 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
19490 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
194a0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
194b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
194c0 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
194d0 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
194e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
194f0 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
19500 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
19510 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
19520 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
19530 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
19540 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
19550 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
19560 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
19570 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
19580 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
19590 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
195a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
195b0 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
195c0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
195d0 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73 65  );.    /* It use
195e0 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71 6c  d to be that sql
195f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
19600 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61 6c  ean(pPg) was cal
19610 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a 20  led here.  But. 
19620 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20     ** that call 
19630 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  was dangerous an
19640 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74 61  d had no detecta
19650 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e 63  ble benefit sinc
19660 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20 20  e the cache.    
19670 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  ** is normally c
19680 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74 65  leaned by sqlite
19690 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
196a0 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  ) after rollback
196b0 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68   and so.    ** h
196c0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  as been removed.
196d0 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73 65   */.    pager_se
196e0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
196f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19700 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
19710 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
19720 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
19730 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
19740 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
19750 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
19760 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
19770 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
19780 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
19790 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
197a0 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
197b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
197c0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
197d0 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
197e0 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
197f0 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c   disk */.#if SQL
19800 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19810 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b    if( jrnlEnc ){
19820 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
19830 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
19840 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
19850 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65  OMEM_BKPT); }.#e
19860 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
19870 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
19880 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
19890 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
198a0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
198b0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
198c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
198d0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
198e0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
198f0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
19900 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19910 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
19920 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
19930 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
19940 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
19950 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
19960 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
19970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
19980 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
19990 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
199a0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
199b0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
199c0 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
199d0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
199e0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
199f0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
19a00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19a10 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
19a20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19a30 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
19a40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
19a50 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
19a60 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
19a70 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
19a80 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
19a90 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
19aa0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
19ab0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
19ac0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
19ad0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
19ae0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
19af0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
19b00 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
19b10 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19b20 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
19b30 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
19b40 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
19b50 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
19b60 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
19b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
19b80 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
19b90 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
19ba0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
19bb0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
19bc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
19bd0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
19be0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
19bf0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
19c00 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
19c10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19c20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19c30 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
19c40 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
19c50 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
19c60 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
19c70 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
19c80 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
19c90 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
19ca0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
19cb0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
19cc0 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
19cd0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
19ce0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
19cf0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
19d00 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
19d10 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
19d20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19d30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
19d40 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
19d50 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
19d60 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
19d70 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
19d80 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
19d90 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
19da0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
19db0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
19dc0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
19dd0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
19de0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
19df0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
19e00 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
19e10 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
19e20 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
19e30 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
19e40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
19e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
19e60 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
19e70 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
19e80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19e90 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
19ea0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19eb0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
19ec0 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
19ed0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
19ee0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
19ef0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
19f00 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19f10 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
19f20 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
19f30 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
19f40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19f50 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
19f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
19f70 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
19f80 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
19f90 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
19fa0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
19fb0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19fc0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
19fd0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
19fe0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
19ff0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
1a000 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
1a010 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
1a020 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
1a030 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
1a040 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
1a050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1a060 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
1a070 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1a080 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
1a090 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a0a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a0b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
1a0c0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
1a0d0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
1a0e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1a0f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a100 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1a110 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
1a120 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
1a130 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
1a140 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
1a150 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
1a160 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
1a170 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
1a180 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1a190 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
1a1a0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
1a1b0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1a1c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
1a1d0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
1a1e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1a1f0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
1a200 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
1a210 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1a220 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
1a230 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
1a240 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
1a250 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
1a260 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
1a270 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
1a280 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
1a290 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
1a2a0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
1a2b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
1a2c0 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
1a2d0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
1a2e0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
1a2f0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
1a300 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
1a310 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
1a320 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
1a330 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
1a340 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
1a350 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
1a360 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
1a370 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
1a380 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
1a390 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
1a3a0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
1a3b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
1a3c0 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
1a3d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a3e0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
1a400 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
1a410 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1a420 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
1a430 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
1a440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a450 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
1a460 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
1a470 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
1a480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a490 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
1a4a0 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
1a4b0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
1a4c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a4d0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
1a4e0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
1a4f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1a500 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
1a510 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
1a520 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
1a530 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
1a540 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
1a550 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
1a560 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
1a570 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
1a580 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
1a590 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
1a5a0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
1a5b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1a5c0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
1a5d0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
1a5e0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
1a5f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1a600 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a610 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
1a620 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
1a630 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
1a640 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1a650 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
1a660 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
1a670 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
1a680 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
1a690 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a6a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1a6b0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a6c0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
1a6d0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
1a6e0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
1a6f0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
1a700 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1a710 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
1a720 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
1a730 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
1a740 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a750 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a760 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
1a770 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
1a780 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
1a790 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
1a7a0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
1a7b0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
1a7c0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
1a7d0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
1a7e0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
1a7f0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
1a800 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1a810 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
1a820 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1a830 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
1a840 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1a860 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a880 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
1a890 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
1a8a0 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
1a8b0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
1a8c0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
1a8d0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
1a8e0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
1a8f0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
1a900 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
1a910 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
1a920 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
1a930 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
1a940 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
1a950 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a960 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
1a970 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1a980 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
1a990 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1a9a0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
1a9b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1a9c0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
1a9d0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
1a9e0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
1a9f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aa00 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1aa10 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1aa20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
1aa30 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1aa40 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
1aa50 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
1aa60 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
1aa70 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
1aa80 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
1aa90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aaa0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1aab0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1aac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
1aad0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
1aae0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
1aaf0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
1ab00 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
1ab10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1ab20 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
1ab30 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
1ab40 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1ab50 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1ab60 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1ab70 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1ab80 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
1ab90 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
1aba0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
1abb0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
1abc0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1abd0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
1abe0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
1abf0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
1ac00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
1ac10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
1ac20 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
1ac30 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
1ac40 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1ac50 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
1ac60 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
1ac70 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
1ac80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
1ac90 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
1aca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1acb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1acc0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
1acd0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
1ace0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1acf0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
1ad00 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
1ad10 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1ad20 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
1ad30 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
1ad40 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
1ad50 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1ad60 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
1ad70 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
1ad80 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
1ad90 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
1ada0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1adb0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
1adc0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
1add0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
1ade0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
1adf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1ae00 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1ae10 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
1ae20 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
1ae30 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
1ae40 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
1ae50 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1ae60 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
1ae70 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
1ae80 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
1ae90 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
1aea0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
1aeb0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
1aec0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
1aed0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
1aee0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
1aef0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
1af00 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1af10 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
1af20 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
1af30 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1af40 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
1af50 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
1af60 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
1af70 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
1af80 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
1af90 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
1afa0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
1afb0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
1afc0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
1afd0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
1afe0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
1aff0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
1b000 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
1b010 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
1b020 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1b030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1b040 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1b050 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
1b060 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
1b070 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
1b080 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
1b090 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1b0a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b0b0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
1b0c0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1b0d0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
1b0e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b0f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b100 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
1b110 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
1b120 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1b130 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
1b140 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
1b150 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
1b160 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1b170 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1b180 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1b190 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1b1a0 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
1b1b0 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
1b1c0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
1b1d0 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
1b1e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1b1f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b200 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
1b210 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
1b220 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
1b230 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
1b240 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
1b250 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
1b260 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1b270 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
1b280 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
1b290 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
1b2a0 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
1b2b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b2c0 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
1b2d0 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
1b2e0 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
1b2f0 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
1b300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b310 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1b320 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
1b330 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1b340 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
1b350 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
1b360 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1b370 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
1b380 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1b390 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
1b3a0 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
1b3b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1b3c0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1b3d0 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
1b3e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1b3f0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1b400 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
1b410 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
1b420 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1b430 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1b440 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
1b450 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
1b460 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b480 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b490 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1b4a0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1b4b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b4c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1b4d0 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1b4e0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1b4f0 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1b500 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1b510 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1b520 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1b530 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1b540 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1b550 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1b560 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1b570 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1b580 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1b590 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1b5a0 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1b5b0 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1b5c0 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1b5d0 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1b5e0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1b5f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1b600 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1b610 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1b620 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1b630 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1b640 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1b650 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1b660 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1b670 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1b680 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1b690 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1b6a0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b6b0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b6c0 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1b6d0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1b6e0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1b6f0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1b700 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1b710 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1b720 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1b730 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b740 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1b750 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1b760 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1b770 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1b780 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1b790 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1b7a0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b7b0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1b7c0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1b7d0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1b7e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1b7f0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b800 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1b810 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b820 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1b830 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1b840 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1b850 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1b860 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1b870 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1b880 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1b890 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1b8a0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1b8b0 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1b8c0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1b8d0 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1b8e0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b8f0 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1b900 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1b910 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b920 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1b930 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1b940 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1b950 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1b960 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1b970 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1b980 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1b990 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1b9a0 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1b9b0 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1b9c0 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1b9d0 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1b9e0 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1b9f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ba00 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1ba10 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1ba20 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1ba30 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ba40 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1ba50 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1ba60 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1ba70 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1ba80 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1ba90 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1baa0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1bab0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1bac0 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1bad0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1bae0 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1baf0 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1bb00 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1bb10 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1bb20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1bb30 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1bb40 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1bb50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1bb60 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1bb70 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1bb80 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1bb90 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1bba0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1bbb0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1bbc0 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1bbd0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1bbe0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1bbf0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1bc00 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1bc10 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1bc20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1bc30 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1bc40 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1bc50 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1bc60 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1bc70 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1bc80 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1bc90 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1bca0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1bcb0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1bcc0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1bcd0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1bce0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1bcf0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1bd00 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1bd10 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1bd20 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1bd30 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1bd40 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1bd50 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1bd60 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1bd70 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1bd80 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1bd90 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1bda0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1bdb0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1bdc0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1bdd0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1bde0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1bdf0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1be00 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1be10 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1be20 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1be30 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1be40 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1be50 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1be60 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1be70 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1be80 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1be90 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1bea0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1beb0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1bec0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1bed0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1bee0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1bef0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1bf00 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1bf10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1bf20 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1bf30 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1bf40 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1bf50 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1bf60 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1bf70 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1bf80 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1bf90 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1bfa0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1bfb0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1bfc0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1bfd0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1bfe0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1bff0 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1c000 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1c010 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1c020 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1c030 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1c040 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1c050 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1c060 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1c070 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1c080 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1c090 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1c0a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1c0b0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1c0c0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1c0d0 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1c0e0 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1c0f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1c100 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1c110 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1c120 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1c130 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1c140 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1c150 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1c160 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1c170 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1c180 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1c190 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1c1a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1c1b0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1c1c0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1c1d0 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1c1e0 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1c1f0 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1c200 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1c210 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1c220 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1c230 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1c240 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1c250 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1c260 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1c270 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1c280 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1c290 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c2a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1c2b0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1c2c0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1c2d0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1c2e0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1c2f0 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1c300 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1c310 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1c320 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1c330 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1c340 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1c350 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1c360 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1c370 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1c380 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1c390 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1c3a0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1c3b0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1c3c0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1c3d0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1c3e0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1c3f0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1c400 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1c410 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1c420 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1c430 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1c440 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1c450 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1c460 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1c470 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1c480 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1c490 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1c4a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c4b0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1c4c0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1c4d0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1c4e0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1c4f0 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1c500 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1c510 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1c520 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1c530 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1c540 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1c550 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1c560 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1c570 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1c580 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1c590 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1c5a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1c5b0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1c5c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1c5d0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1c5e0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1c5f0 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1c600 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1c610 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1c620 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1c630 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1c640 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1c650 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1c660 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1c670 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1c680 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c690 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1c6a0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1c6b0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c6c0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1c6d0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1c6e0 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1c6f0 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1c700 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1c710 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1c720 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1c730 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1c740 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1c750 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1c760 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1c770 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c780 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1c790 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1c7a0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1c7b0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1c7c0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1c7d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1c7e0 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1c7f0 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1c800 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1c810 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1c820 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1c830 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1c840 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c850 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c860 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c880 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1c890 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1c8a0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1c8d0 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1c8e0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c900 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1c910 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1c920 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1c930 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c940 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1c950 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1c960 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c980 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1c990 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1c9a0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1c9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1c9c0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1c9d0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1c9e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1c9f0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1ca00 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1ca10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1ca20 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1ca30 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1ca40 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1ca50 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1ca60 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1ca70 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1ca80 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1ca90 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1caa0 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1cab0 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1cac0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  al */.  u32 save
1cad0 64 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  dPageSize = pPag
1cae0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
1caf0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1cb00 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1cb10 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1cb20 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1cb30 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1cb40 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1cb50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1cb60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1cb70 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1cb80 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1cb90 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1cba0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1cbb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1cbc0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1cbd0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1cbe0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1cbf0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1cc00 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1cc10 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1cc20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1cc30 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1cc40 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1cc50 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1cc60 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1cc70 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1cc80 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1cc90 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1cca0 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1ccb0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1ccc0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1ccd0 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1cce0 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1ccf0 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1cd00 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1cd10 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1cd20 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1cd30 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1cd40 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1cd50 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1cd60 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1cd70 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1cd80 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1cd90 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1cda0 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1cdb0 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1cdc0 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1cdd0 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1cde0 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1cdf0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1ce00 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1ce10 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1ce20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1ce30 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1ce40 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1ce50 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1ce60 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1ce70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1ce80 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1ce90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1cea0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1ceb0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1cec0 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1ced0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1cee0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1cef0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1cf00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1cf10 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1cf20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cf30 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1cf40 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1cf50 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1cf60 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1cf70 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1cf80 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1cf90 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1cfa0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1cfb0 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1cfc0 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1cfd0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1cfe0 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1cff0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1d000 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1d010 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1d020 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1d030 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1d040 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1d050 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1d060 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1d070 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1d080 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1d090 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1d0a0 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1d0b0 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1d0c0 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1d0d0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1d0e0 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1d0f0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1d100 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1d110 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1d120 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1d130 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1d140 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1d150 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1d160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1d170 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d180 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1d190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d1a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1d1b0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d1c0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1d1d0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1d1e0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1d1f0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1d200 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1d210 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1d220 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1d230 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1d240 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1d250 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1d260 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1d270 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1d280 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1d290 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1d2a0 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1d2b0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1d2c0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1d2d0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1d2e0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1d2f0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1d300 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d310 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1d320 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1d330 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1d340 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1d350 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1d360 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1d370 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1d380 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1d390 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1d3a0 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1d3b0 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1d3c0 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1d3d0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1d3e0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1d3f0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1d400 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1d410 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1d420 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1d430 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1d440 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1d450 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1d460 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1d470 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1d480 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1d490 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1d4a0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1d4b0 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1d4c0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1d4d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1d4e0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1d4f0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1d500 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1d510 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1d520 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1d530 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1d540 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1d550 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1d560 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1d570 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1d580 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1d590 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1d5a0 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1d5b0 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1d5c0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1d5d0 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1d5e0 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1d5f0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1d600 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1d610 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1d620 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1d630 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1d640 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1d650 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1d660 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1d670 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1d680 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1d690 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1d6a0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1d6b0 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1d6c0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1d6d0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1d6e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d6f0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1d700 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d710 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1d720 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1d730 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1d740 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1d750 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1d760 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1d770 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d780 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1d790 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1d7a0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1d7b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d7c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d7d0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1d7e0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1d7f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1d800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1d810 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1d820 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1d830 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1d840 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1d850 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1d860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d870 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d880 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1d890 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1d8a0 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1d8b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1d8c0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1d8d0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1d8e0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1d8f0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1d900 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1d910 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1d920 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1d930 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1d940 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1d950 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1d960 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1d970 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d980 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1d990 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d9a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1d9b0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1d9c0 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1d9d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1d9e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1d9f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1da00 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1da10 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
1da20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1da30 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1da40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1da50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1da60 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1da70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1da80 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1da90 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1daa0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1dab0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1dac0 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1dad0 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1dae0 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1daf0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1db00 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1db10 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1db20 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1db30 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1db40 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1db50 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1db60 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1db70 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1db80 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1db90 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1dba0 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1dbb0 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1dbc0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1dbd0 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1dbe0 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1dbf0 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1dc00 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1dc10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1dc20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1dc30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1dc40 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1dc50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1dc60 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1dc70 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1dc80 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1dc90 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1dca0 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1dcb0 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1dcc0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1dcd0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1dce0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1dcf0 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1dd00 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1dd10 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1dd20 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1dd30 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1dd40 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1dd50 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1dd60 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1dd70 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1dd80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1dd90 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1dda0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ddb0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1ddc0 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1ddd0 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1dde0 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
1ddf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1de00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1de10 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
1de20 61 67 65 72 2c 20 26 73 61 76 65 64 50 61 67 65  ager, &savedPage
1de30 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20  Size, -1);.  }. 
1de40 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1de50 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1de60 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1de70 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1de80 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1de90 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1dea0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1deb0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1dec0 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1ded0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1dee0 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1def0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1df00 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1df10 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1df20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1df30 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1df40 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1df50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1df60 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1df70 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1df80 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1df90 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1dfa0 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  0);.#endif..  /*
1dfb0 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1dfc0 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1dfd0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1dfe0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1dff0 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1e000 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1e010 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1e020 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1e030 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1e040 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1e050 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1e060 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1e070 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1e080 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1e090 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1e0a0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1e0b0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1e0c0 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1e0d0 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1e0e0 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1e0f0 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1e100 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1e110 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1e120 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1e130 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1e140 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1e150 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1e160 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1e170 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1e180 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1e190 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1e1a0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1e1b0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1e1c0 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1e1d0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1e1e0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1e1f0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1e200 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1e210 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1e220 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1e230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e240 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1e250 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1e260 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1e270 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1e280 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1e290 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1e2a0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1e2b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1e2c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1e2d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1e2e0 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1e2f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1e300 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1e310 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1e320 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1e330 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1e340 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1e350 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
1e360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e370 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1e380 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1e390 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1e3a0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30  ster[0]!='\0', 0
1e3b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1e3c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e3d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1e3e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1e3f0 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1e400 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1e410 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1e420 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1e430 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1e440 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1e450 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1e460 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1e470 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1e480 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1e490 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1e4a0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1e4b0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1e4c0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1e4d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1e4e0 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61  f( isHot && nPla
1e4f0 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  yback ){.    sql
1e500 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1e510 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
1e520 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65  OLLBACK, "recove
1e530 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f  red %d pages fro
1e540 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  m %s",.         
1e550 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1e560 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1e570 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  al);.  }..  /* T
1e580 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1e590 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1e5a0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1e5b0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1e5c0 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1e5d0 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1e5e0 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1e5f0 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1e600 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1e610 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1e620 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1e630 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1e640 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1e650 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1e660 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e670 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1e680 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1e690 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1e6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1e6b0 6f 72 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65  or out of.** the
1e6c0 20 57 41 4c 20 69 66 20 74 68 61 74 20 69 73 20   WAL if that is 
1e6d0 77 68 65 72 65 20 74 68 65 20 6d 6f 73 74 20 72  where the most r
1e6e0 65 63 65 6e 74 20 63 6f 70 79 20 69 66 20 66 6f  ecent copy if fo
1e6f0 75 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50  und) into .** pP
1e700 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1e710 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1e720 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1e730 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1e740 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1e750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e760 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1e770 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1e780 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1e790 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1e7a0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1e7b0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1e7c0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1e7d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1e7e0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1e7f0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1e800 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1e810 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1e820 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1e830 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1e840 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1e850 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1e860 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1e870 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e880 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1e890 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1e8a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1e8b0 67 65 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20  ge pPg */.  int 
1e8c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e8e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e  rn code */..#ifn
1e8f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e900 57 41 4c 0a 20 20 75 33 32 20 69 46 72 61 6d 65  WAL.  u32 iFrame
1e910 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e920 20 20 20 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57     /* Frame of W
1e930 41 4c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67  AL containing pg
1e940 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  no */..  assert(
1e950 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1e960 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1e970 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1e980 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1e990 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
1e9a0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1e9b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
1e9c0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e9d0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e9e0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e9f0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  iFrame);.    if(
1ea00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1ea10 0a 20 20 7d 0a 20 20 69 66 28 20 69 46 72 61 6d  .  }.  if( iFram
1ea20 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
1ea30 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1ea40 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1ea50 69 46 72 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70  iFrame,pPager->p
1ea60 61 67 65 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61  ageSize,pPg->pDa
1ea70 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ta);.  }else.#en
1ea80 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  dif.  {.    i64 
1ea90 69 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d 3e  iOffset = (pPg->
1eaa0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1eab0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1eac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ead0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1eae0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
1eaf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1eb00 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
1eb10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1eb20 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1eb30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1eb40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1eb50 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  ..  if( pPg->pgn
1eb60 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1eb70 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1eb80 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1eb90 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1eba0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1ebb0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1ebc0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1ebd0 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1ebe0 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1ebf0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1ec00 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1ec10 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1ec20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ec30 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1ec40 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1ec50 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1ec60 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1ec70 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1ec80 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1ec90 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1eca0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1ecb0 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1ecc0 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1ecd0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1ece0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1ecf0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1ed00 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1ed10 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1ed20 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1ed30 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1ed40 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1ed50 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1ed60 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1ed70 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1ed80 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1ed90 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1eda0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1edb0 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1edc0 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1edd0 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20   noise equaling 
1ede0 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1edf0 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1ee00 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1ee10 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1ee20 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1ee30 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1ee40 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ee50 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1ee60 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ee70 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1ee80 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1ee90 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1eea0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1eeb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1eec0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1eed0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1eee0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1eef0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1ef00 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1ef10 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1ef20 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
1ef30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1ef40 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45  M_BKPT);..  PAGE
1ef50 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1ef60 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1ef70 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1ef80 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1ef90 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1efa0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1efb0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
1efc0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1efd0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1efe0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1f000 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1f010 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
1f020 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1f030 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1f040 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1f050 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1f060 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1f070 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1f080 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1f090 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1f0a0 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1f0b0 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1f0c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1f0d0 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1f0e0 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1f0f0 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1f100 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1f110 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1f120 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1f130 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1f140 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1f150 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1f160 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1f170 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1f180 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1f190 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1f1a0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1f1b0 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1f1c0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1f1d0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1f1e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1f1f0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1f200 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1f210 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1f220 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1f230 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1f240 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1f250 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1f260 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1f270 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1f280 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1f290 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1f2a0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1f2b0 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1f2c0 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1f2d0 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1f2e0 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1f2f0 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1f300 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1f310 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1f320 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1f330 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1f340 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1f350 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1f360 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1f370 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1f380 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1f390 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1f3a0 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1f3b0 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1f3c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f3d0 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1f3e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1f3f0 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1f400 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1f410 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1f420 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1f430 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1f440 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1f450 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1f460 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1f470 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1f480 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1f490 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1f4a0 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1f4b0 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1f4c0 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1f4d0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1f4e0 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1f4f0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1f500 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1f510 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1f520 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1f530 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1f540 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1f550 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1f560 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1f570 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1f580 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1f590 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1f5a0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1f5b0 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1f5c0 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1f5d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1f5e0 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1f5f0 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1f600 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1f610 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1f620 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1f630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f640 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1f650 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1f660 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1f670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1f680 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1f690 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1f6a0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1f6b0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1f6c0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1f6d0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1f6e0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1f6f0 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1f700 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1f710 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1f720 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1f730 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1f740 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1f750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1f760 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1f770 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1f780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f790 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f7a0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1f7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1f7c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1f7d0 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1f7e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1f7f0 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1f800 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1f810 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1f820 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1f830 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1f840 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1f850 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1f860 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1f870 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1f880 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1f890 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1f8a0 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1f8b0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1f8c0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1f8d0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1f8e0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1f8f0 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1f900 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1f910 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1f920 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1f930 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1f940 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1f950 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1f960 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1f970 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1f980 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1f990 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1f9a0 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1f9b0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1f9c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1f9d0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1f9e0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1f9f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fa00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fa10 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1fa20 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1fa30 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1fa40 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1fa50 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1fa60 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1fa70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1faa0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1fab0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fad0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1fae0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1faf0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1fb00 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1fb10 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1fb20 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1fb30 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1fb40 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1fb50 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1fb60 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1fb70 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1fb80 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1fb90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1fba0 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1fbb0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1fbc0 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1fbd0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1fbe0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1fbf0 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1fc00 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1fc10 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1fc20 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1fc30 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1fc40 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1fc50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1fc60 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1fc70 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1fc80 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1fc90 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1fca0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1fcb0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1fcc0 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
1fcd0 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  NT.  /* If this 
1fce0 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  is an CONCURRENT
1fcf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1fd00 65 6e 20 70 61 67 65 20 31 20 6d 75 73 74 20 62  en page 1 must b
1fd10 65 20 72 65 72 65 61 64 20 66 72 6f 6d 20 0a 20  e reread from . 
1fd20 20 2a 2a 20 74 68 65 20 64 62 20 66 69 6c 65 2c   ** the db file,
1fd30 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
1fd40 6f 74 20 64 69 72 74 79 2e 20 54 68 69 73 20 69  ot dirty. This i
1fd50 73 20 62 65 63 61 75 73 65 20 74 68 65 20 62 2d  s because the b-
1fd60 74 72 65 65 20 6c 61 79 65 72 20 0a 20 20 2a 2a  tree layer .  **
1fd70 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64   may have alread
1fd80 79 20 7a 65 72 6f 65 64 20 74 68 65 20 6e 46 72  y zeroed the nFr
1fd90 65 65 20 61 6e 64 20 69 54 72 75 6e 6b 20 68 65  ee and iTrunk he
1fda0 61 64 65 72 20 66 69 65 6c 64 73 2e 20 20 2a 2f  ader fields.  */
1fdb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fdc0 45 5f 4f 4b 20 26 26 20 28 70 4c 69 73 74 3d 3d  E_OK && (pList==
1fdd0 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  0 || pList->pgno
1fde0 21 3d 31 29 20 26 26 20 70 50 61 67 65 72 2d 3e  !=1) && pPager->
1fdf0 70 41 6c 6c 52 65 61 64 20 29 7b 0a 20 20 20 20  pAllRead ){.    
1fe00 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1fe10 6c 6c 62 61 63 6b 28 28 76 6f 69 64 2a 29 70 50  llback((void*)pP
1fe20 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 23 65  ager, 1);.  }.#e
1fe30 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 70  ndif..  while( p
1fe40 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1fe50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1fe60 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1fe70 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1fe80 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1fe90 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1fea0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1feb0 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1fec0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1fed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fee0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1fef0 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1ff00 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1ff10 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1ff20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1ff30 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ff40 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1ff50 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1ff60 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1ff70 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1ff80 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1ff90 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1ffa0 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1ffb0 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1ffc0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1ffd0 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1ffe0 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1fff0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
20000 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
20010 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
20020 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
20030 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
20040 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
20050 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
20060 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
20070 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20080 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
20090 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200b0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
200c0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
200f0 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
20100 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
20130 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
20140 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
20150 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
20160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20170 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
20180 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
20190 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
201c0 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
201f0 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
20200 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
20230 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a   over pages */..
20240 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20250 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
20260 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
20270 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20280 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
20290 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
202a0 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
202b0 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
202c0 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
202d0 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
202e0 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
202f0 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
20300 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
20310 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
20320 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
20330 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
20340 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
20350 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
20360 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
20370 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
20380 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
20390 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
203a0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
203b0 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
203c0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
203d0 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
203e0 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
203f0 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
20400 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
20410 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
20420 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
20430 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
20440 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
20450 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  */.    PgHdr **p
20460 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
20470 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
20480 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
20490 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
204a0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
204b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
204c0 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
204d0 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
204e0 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
204f0 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
20500 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
20510 28 28 22 54 4f 2d 57 41 4c 20 25 64 20 70 61 67  (("TO-WAL %d pag
20520 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
20530 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
20540 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
20550 28 70 50 61 67 65 72 29 2c 20 70 2d 3e 70 67 6e  (pPager), p->pgn
20560 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
20570 68 28 70 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  h(p)));.      }.
20580 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20590 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
205a0 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
205b0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
205c0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
205d0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
205e0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
205f0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
20600 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
20610 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
20620 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
20630 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
20640 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
20650 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
20660 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
20670 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
20680 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
20690 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
206a0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
206b0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
206c0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
206d0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
206e0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
206f0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
20700 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
20710 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
20720 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
20730 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
20740 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
20750 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
20760 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
20770 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
20780 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
20790 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
207a0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
207b0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
207c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
207d0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
207e0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
207f0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
20800 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20810 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
20820 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
20830 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
20840 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
20850 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
20860 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
20870 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
20880 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
20890 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
208a0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
208b0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
208c0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
208d0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
208e0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
208f0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
20900 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
20910 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
20920 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
20930 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
20940 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20970 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
20980 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
20990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
209a0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
209b0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
209c0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
209d0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
209e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
209f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
20a00 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
20a10 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
20a20 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
20a30 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20a40 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
20a50 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
20a60 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
20a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
20a80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
20a90 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
20aa0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
20ab0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
20ac0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
20ad0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
20ae0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
20af0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
20b00 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
20b10 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
20b20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
20b30 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20b40 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
20b50 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
20b60 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
20b70 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
20b80 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
20b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20ba0 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
20bb0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
20bc0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
20bd0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
20be0 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
20bf0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
20c00 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
20c10 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
20c20 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
20c30 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20  RNALMODE_WAL.   
20c40 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
20c50 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
20c60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20c70 57 41 4c 32 0a 20 20 20 20 29 3b 0a 20 20 20 20  WAL2.    );.    
20c80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20c90 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  ode = sqlite3Wal
20ca0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
20cb0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 7d 0a 0a  er->pWal);.  }..
20cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
20cd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
20ce0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
20cf0 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
20d00 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
20d10 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
20d20 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
20d30 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
20d40 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
20d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20d60 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
20d70 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
20d80 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
20d90 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
20da0 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
20db0 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
20dc0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
20dd0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20de0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20df0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
20e00 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
20e10 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
20e20 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
20e30 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
20e40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
20e50 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
20e60 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
20e70 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
20e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20e90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
20ea0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
20eb0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
20ec0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ee0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
20ef0 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
20f00 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
20f10 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
20f20 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
20f30 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
20f40 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
20f50 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
20f60 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
20f70 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
20f80 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
20f90 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
20fa0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
20fb0 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
20fc0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
20fd0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
20fe0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
20ff0 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
21000 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
21010 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
21020 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
21030 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
21040 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
21050 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21060 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
21070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21080 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
21090 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
210a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
210b0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
210c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
210d0 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e  mpFile==0 );.  n
210e0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
210f0 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
21100 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
21110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
21120 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
21130 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
21140 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
21150 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
21160 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
21170 20 70 61 67 65 20 63 6f 75 6e 74 20 62 61 73 65   page count base
21180 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
21190 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
211a0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
211b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
211c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
211d0 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65  t an.  ** intege
211e0 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
211f0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75  e page-size, rou
21200 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74  nd up the result
21210 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
21220 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ge==0 && ALWAYS(
21230 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
21240 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  d)) ){.    i64 n
21250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21260 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21270 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
21280 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
21290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
212a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
212b0 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28 20  d, &n);.    if( 
212c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
212d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
212e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67  ;.    }.    nPag
212f0 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50  e = (Pgno)((n+pP
21300 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31  ager->pageSize-1
21310 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) / pPager->page
21320 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
21330 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
21340 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
21350 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
21360 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a  reater than the.
21370 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
21380 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75  maximum pager nu
21390 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74  mber, increase t
213a0 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74  he allowed limit
213b0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
213c0 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65  e file can be re
213d0 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ad..  */.  if( n
213e0 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50  Page>pPager->mxP
213f0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
21400 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
21410 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  o)nPage;.  }..  
21420 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  *pnPage = nPage;
21430 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21440 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
21450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
21460 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
21470 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68  he *-wal file th
21480 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
21490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
214a0 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a  pened by pPager.
214b0 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65  ** exists if the
214c0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
214d0 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79   empy, or verify
214e0 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20   that the *-wal 
214f0 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
21500 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74   exist (by delet
21510 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64  ing it) if the d
21520 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
21530 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
21540 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21550 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68  not empty and th
21560 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  e *-wal file exi
21570 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61  sts, open the pa
21580 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f  ger.** in WAL mo
21590 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  de.  If the data
215a0 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72  base is empty or
215b0 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c   if no *-wal fil
215c0 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20  e exists and.** 
215d0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
215e0 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
215f0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
21600 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a  is not set to.**
21610 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
21620 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  DE_WAL..**.** Re
21630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21640 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  r an error code.
21650 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
21660 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48  r must hold a SH
21670 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
21680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
21690 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66  o call this.** f
216a0 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65  unction. Because
216b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
216c0 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  ck on the db fil
216d0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
216e0 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41   delete .** a WA
216f0 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74  L on a none-empt
21700 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73  y database, this
21710 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69   ensures there i
21720 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74  s no race condit
21730 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ion .** between 
21740 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65  the xAccess() be
21750 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65  low and an xDele
21760 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75  te() being execu
21770 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20  ted by some .** 
21780 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
21790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
217a0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
217b0 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  esent(Pager *pPa
217c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
217d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
217e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
217f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
21800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21810 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
21820 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  RED_LOCK );..  i
21830 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
21840 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
21850 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  isWal;          
21860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21870 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78  e if WAL file ex
21880 69 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ists */.    rc =
21890 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
218a0 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
218b0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
218c0 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
218d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
218e0 61 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  al.    );.    if
218f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21900 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57  ){.      if( isW
21910 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  al ){.        Pg
21920 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
21930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21940 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
21950 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
21960 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
21970 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
21980 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
21990 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
219a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
219b0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
219c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
219d0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
219e0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
219f0 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
21a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21a20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
21a30 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
21a40 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
21a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21a60 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
21a70 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
21a80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21a90 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
21aa0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3e 3d 50  ->journalMode>=P
21ab0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21ac0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
21ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
21ae0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
21af0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
21b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21b10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21b20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
21b30 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
21b40 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
21b50 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
21b60 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
21b70 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
21b80 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
21b90 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
21ba0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
21bb0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
21bc0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
21bd0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
21be0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
21bf0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
21c00 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
21c10 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
21c20 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
21c30 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
21c40 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
21c50 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
21c60 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
21c70 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
21c80 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
21c90 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
21ca0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
21cb0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
21cc0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
21cd0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
21ce0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
21cf0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
21d00 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21d10 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
21d20 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
21d30 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
21d40 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
21d50 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
21d60 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
21d70 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
21d80 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21d90 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
21da0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
21db0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
21dc0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
21dd0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
21de0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
21df0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
21e00 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
21e10 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
21e20 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
21e30 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
21e40 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
21e50 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
21e60 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21e70 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
21e80 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21e90 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
21ea0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
21eb0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
21ec0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
21ed0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
21ee0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
21ef0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
21f00 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
21f10 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
21f20 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
21f30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
21f40 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
21f50 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
21f60 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
21f70 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
21f80 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
21f90 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
21fa0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
21fb0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
21fc0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
21fd0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
21fe0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
21ff0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
22000 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
22010 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
22020 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
22030 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
22040 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
22050 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
22060 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
22070 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
22080 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
22090 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
220a0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
220b0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
220c0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
220d0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
220e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
220f0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
22100 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
22110 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
22120 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
22130 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
22140 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
22150 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
22160 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
22170 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
22180 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
22190 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
221a0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
221b0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
221c0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
221d0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
221e0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
221f0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
22200 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
22210 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
22220 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
22230 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
22240 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
22250 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
22260 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
22270 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
22280 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
22290 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
222a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
222b0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
222c0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
222d0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
222e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
222f0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
22300 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
22310 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
22320 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
22330 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
22340 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
22350 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
22360 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
22370 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
22380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
22390 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
223a0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
223b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
223c0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
223d0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
223e0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
223f0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
22400 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
22410 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
22420 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
22430 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
22440 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
22450 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
22460 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
22470 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
22480 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
22490 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
224a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
224b0 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
224c0 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
224d0 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
224e0 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
224f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
22500 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
22510 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
22520 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
22530 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
22540 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
22550 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
22560 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
22570 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
22580 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
22590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
225a0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
225b0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
225c0 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
225d0 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
225e0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
225f0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
22600 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
22610 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
22620 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
22630 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
22640 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
22650 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
22660 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
22670 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
22680 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
22690 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
226a0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
226b0 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
226c0 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
226d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
226e0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
226f0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
22700 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
22710 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
22720 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
22730 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
22740 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
22750 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
22760 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
22770 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
22780 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
22790 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
227a0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
227b0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
227c0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
227d0 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
227e0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
227f0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
22800 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
22810 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
22820 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
22830 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
22840 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
22850 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
22860 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
22870 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
22880 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
22890 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
228a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
228b0 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
228c0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
228d0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
228e0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
228f0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
22900 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22910 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
22920 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
22930 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
22940 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22950 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
22960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22970 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22980 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
22990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
229a0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
229b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
229c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
229d0 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
229e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
229f0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
22a00 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
22a10 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
22a20 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
22a30 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
22a40 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
22a50 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
22a60 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
22a70 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
22a80 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
22a90 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
22aa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
22ab0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
22ac0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
22ad0 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
22ae0 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
22af0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
22b00 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
22b10 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
22b20 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
22b30 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
22b40 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
22b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22b60 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
22b70 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
22b80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22b90 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
22ba0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
22bb0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
22bc0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
22bd0 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
22be0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
22bf0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22c00 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
22c10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
22c20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22c30 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
22c40 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
22c50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
22c60 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
22c70 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
22c80 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
22c90 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
22ca0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
22cb0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
22cc0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
22cd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
22ce0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
22cf0 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
22d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22d10 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
22d20 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
22d30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
22d40 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
22d50 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
22d60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22d70 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
22d80 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
22d90 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
22da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
22db0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
22dc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
22dd0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
22de0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22df0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22e00 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
22e10 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
22e20 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
22e30 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22e40 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22e50 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
22e60 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
22e70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
22e80 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
22e90 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
22ea0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
22eb0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
22ec0 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
22ed0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
22ee0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
22ef0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
22f00 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
22f10 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
22f20 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
22f30 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
22f40 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
22f50 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
22f60 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
22f70 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
22f80 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22f90 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
22fa0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
22fb0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
22fc0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
22fd0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
22fe0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
22ff0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
23000 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
23010 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
23020 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
23030 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
23040 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
23050 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
23060 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
23070 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
23080 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
23090 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
230a0 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
230b0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
230c0 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
230d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
230e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
230f0 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
23100 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
23110 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
23120 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
23130 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
23140 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
23150 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
23160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
23170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23180 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
23190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
231a0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
231b0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
231c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
231d0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
231e0 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
231f0 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65  pting to recycle
23200 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65   clean and unuse
23210 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  d pages..*/.void
23220 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23230 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
23240 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
23250 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
23260 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
23270 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
23280 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
23290 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
232a0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
232b0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
232c0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
232d0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
232e0 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c  empting to spill
232f0 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61   pages to journa
23300 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
23310 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
23320 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
23330 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
23340 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
23350 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a  cacheSetSpillsiz
23360 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
23370 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
23380 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
23390 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
233a0 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
233b0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
233c0 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
233d0 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
233e0 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
233f0 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
23400 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
23410 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
23420 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
23430 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
23440 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
23450 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
23460 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
23470 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
23480 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
23490 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
234a0 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
234b0 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65 74 74  >0);.    setGett
234c0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
234d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
234e0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
234f0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23500 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
23510 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
23520 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
23530 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
23540 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
23550 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
23560 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23570 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
23580 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
23590 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
235a0 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
235b0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
235c0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
235d0 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
235e0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
235f0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
23600 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
23610 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
23620 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
23630 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23640 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
23650 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
23660 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
23670 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
23680 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
23690 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
236a0 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
236b0 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
236c0 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
236d0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
236e0 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
236f0 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
23700 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
23710 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
23720 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23730 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
23740 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
23750 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
23760 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
23770 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
23780 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
23790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
237a0 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f 75 72  * There are four
237b0 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
237c0 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
237d0 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
237e0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
237f0 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
23800 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23810 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
23820 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
23830 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
23840 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
23850 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
23860 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
23870 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
23890 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
238a0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
238b0 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
238c0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
238d0 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
238e0 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
238f0 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
23900 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
23910 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
23920 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
23930 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
23940 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
23950 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23960 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
23970 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
23980 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
23990 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
239a0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
239b0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
239c0 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
239d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
239e0 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
239f0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
23a00 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
23a10 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
23a20 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
23a30 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
23a40 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
23a50 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
23a60 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
23a70 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
23a80 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
23a90 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
23aa0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
23ab0 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
23ac0 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
23ad0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23ae0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
23af0 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
23b00 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
23b10 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
23b20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
23b30 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
23b40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
23b50 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
23b70 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
23b80 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
23b90 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
23ba0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lback..**.**    
23bb0 45 58 54 52 41 20 20 20 20 20 54 68 69 73 20 69  EXTRA     This i
23bc0 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65  s like FULL exce
23bd0 70 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20  pt that is also 
23be0 73 79 6e 63 73 20 74 68 65 20 64 69 72 65 63 74  syncs the direct
23bf0 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ory.**          
23c00 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e      that contain
23c10 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  s the rollback j
23c20 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65  ournal after the
23c30 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20   rollback.**    
23c40 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
23c50 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  l is unlinked..*
23c60 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
23c70 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
23c80 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
23c90 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
23ca0 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
23cb0 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
23cc0 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
23cd0 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
23ce0 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
23cf0 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
23d00 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
23d10 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
23d20 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
23d30 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
23d40 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
23d50 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
23d60 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
23d70 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
23d80 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
23d90 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
23da0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
23db0 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
23dc0 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
23dd0 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
23de0 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
23df0 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
23e00 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
23e10 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
23e20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
23e30 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
23e40 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
23e50 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
23e60 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
23e70 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20  d with NORMAL.  
23e80 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
23e90 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46  erence between F
23ea0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41  ULL.** and EXTRA
23eb0 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a   for WAL mode..*
23ec0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
23ed0 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
23ee0 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
23ef0 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
23f00 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
23f10 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
23f20 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
23f30 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
23f40 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
23f50 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
23f60 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
23f70 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
23f80 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
23f90 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
23fa0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
23fb0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
23fc0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
23fd0 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
23fe0 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
23ff0 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
24000 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
24010 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
24020 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
24030 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
24040 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
24050 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
24060 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
24070 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
24080 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
24090 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
240a0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
240b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
240c0 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
240d0 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
240e0 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
240f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
24100 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
24110 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
24120 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
24130 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
24140 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
24150 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
24160 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
24170 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
24180 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72  lags      /* Var
24190 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ious flags */.){
241a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65  .  unsigned leve
241b0 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41  l = pgFlags & PA
241c0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
241d0 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  MASK;.  if( pPag
241e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
241f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
24200 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
24210 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30  er->fullSync = 0
24220 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
24230 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  traSync = 0;.  }
24240 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
24250 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
24260 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
24270 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20  NOUS_OFF ?1:0;. 
24280 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
24290 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47  ync = level>=PAG
242a0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46  ER_SYNCHRONOUS_F
242b0 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  ULL ?1:0;.    pP
242c0 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
242d0 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53  = level==PAGER_S
242e0 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41  YNCHRONOUS_EXTRA
242f0 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28   ?1:0;.  }.  if(
24300 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
24310 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
24320 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
24330 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
24340 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53  s & PAGER_FULLFS
24350 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
24360 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
24370 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
24380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
24390 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
243a0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
243b0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RMAL;.  }.  pPag
243c0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
243d0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63   = (pPager->sync
243e0 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20 69 66 28  Flags<<2);.  if(
243f0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
24400 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
24410 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
24420 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
24430 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  gs;.  }.  if( (p
24440 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
24450 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 29 20 26  KPT_FULLFSYNC) &
24460 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
24470 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
24480 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
24490 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55   (SQLITE_SYNC_FU
244a0 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 69 66  LL<<2);.  }.  if
244b0 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
244c0 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a  R_CACHESPILL ){.
244d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
244e0 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
244f0 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  FLAG_OFF;.  }els
24500 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  e{.    pPager->d
24510 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
24520 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a  LLFLAG_OFF;.  }.
24530 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24540 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
24550 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
24560 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
24570 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
24580 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
24590 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
245a0 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
245b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
245c0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
245d0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
245e0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
245f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
24600 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
24610 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
24620 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
24630 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
24640 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
24650 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24660 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
24670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
24680 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
24690 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
246a0 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
246b0 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
246c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
246d0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
246e0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
246f0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
24700 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
24710 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
24720 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
24730 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
24740 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
24750 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
24760 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
24770 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
24780 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
24790 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
247a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
247b0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
247c0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
247d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
247e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
247f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
24800 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
24810 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
24830 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
24840 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
24850 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
24860 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
24870 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
24880 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
24890 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
248a0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
248b0 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
248c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
248d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
248e0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
248f0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
24900 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
24910 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
24920 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
24930 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
24940 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
24950 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
24960 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
24970 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
24980 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
24990 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
249a0 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
249b0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
249c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
249d0 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
249e0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
249f0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
24a00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
24a10 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
24a20 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
24a30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
24a40 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
24a50 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
24a60 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
24a70 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
24a80 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
24a90 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
24aa0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
24ab0 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
24ac0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
24ad0 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
24ae0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
24af0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
24b00 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
24b10 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
24b20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
24b30 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
24b40 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
24b50 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
24b60 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
24b70 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
24b80 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
24b90 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
24ba0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
24bb0 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
24bc0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
24bd0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
24be0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
24bf0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
24c20 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
24c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c60 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
24c70 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
24c80 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
24c90 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
24ca0 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
24cb0 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
24cc0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
24cd0 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
24ce0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
24cf0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
24d00 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
24d10 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
24d20 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
24d30 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
24d40 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
24d50 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
24d60 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
24d70 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
24d80 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
24d90 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
24da0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
24db0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
24dc0 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
24dd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24de0 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72  erSetBusyHandler
24df0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
24e00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
24e10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
24e20 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
24e30 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
24e40 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
24e50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
24e60 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
24e70 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
24e80 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
24e90 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
24ea0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
24eb0 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
24ec0 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  dler */.){.  voi
24ed0 64 20 2a 2a 61 70 3b 0a 20 20 70 50 61 67 65 72  d **ap;.  pPager
24ee0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
24ef0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
24f00 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
24f10 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
24f20 48 61 6e 64 6c 65 72 41 72 67 3b 0a 20 20 61 70  HandlerArg;.  ap
24f30 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61   = (void **)&pPa
24f40 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24f50 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 69  r;.  assert( ((i
24f60 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61  nt(*)(void *))(a
24f70 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e  p[0]))==xBusyHan
24f80 64 6c 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  dler );.  assert
24f90 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61  ( ap[1]==pBusyHa
24fa0 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 73 71  ndlerArg );.  sq
24fb0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
24fc0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
24fd0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
24fe0 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f  BUSYHANDLER, (vo
24ff0 69 64 20 2a 29 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a  id *)ap);.}../*.
25000 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
25010 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
25020 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
25030 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
25040 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
25050 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
25060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
25070 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
25080 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
25090 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
250a0 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
250b0 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
250c0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
250d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
250e0 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
250f0 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
25100 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
25110 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
25120 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
25130 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
25140 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
25150 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
25160 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
25170 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
25180 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
25190 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
251a0 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
251b0 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
251c0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
251d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
251e0 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
251f0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
25200 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
25210 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
25220 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
25230 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
25240 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
25250 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
25260 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
25270 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
25280 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
25290 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
252a0 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
252b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
252c0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
252d0 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
252e0 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
252f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
25300 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
25310 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
25320 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
25330 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
25340 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
25350 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
25360 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
25370 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
25380 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
25390 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
253a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
253b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
253c0 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
253d0 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
253e0 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
253f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
25400 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
25410 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
25420 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
25430 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
25440 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
25450 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
25460 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
25470 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
25480 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
25490 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
254a0 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
254b0 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
254c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
254d0 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
254e0 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
254f0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
25500 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
25510 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
25520 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
25530 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
25540 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
25550 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
25560 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
25570 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
25580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
25590 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
255a0 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
255b0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
255c0 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
255d0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
255e0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
255f0 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
25600 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
25610 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
25620 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
25630 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
25640 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
25650 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
25660 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
25670 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
25680 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
25690 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
256a0 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
256b0 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
256c0 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
256d0 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
256e0 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
256f0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
25700 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
25710 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
25720 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
25730 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
25740 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
25750 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
25760 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
25770 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
25780 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
25790 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
257a0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
257b0 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
257c0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
257d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
257e0 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
257f0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
25800 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
25810 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
25820 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
25830 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
25840 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
25850 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
25860 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
25870 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
25880 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
25890 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
258a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
258b0 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
258c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
258d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
258e0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
258f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
25900 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
25910 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
25930 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
25940 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
25950 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
25960 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
25970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25980 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
25990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
259a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
259b0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
259c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
259d0 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
259e0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
259f0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
25a00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
25a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25a20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
25a30 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
25a40 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
25a50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
25a60 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
25a70 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
25a80 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
25a90 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
25aa0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
25ab0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
25ac0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
25ad0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
25ae0 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
25af0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
25b00 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
25b10 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
25b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25b30 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
25b40 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
25b50 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
25b60 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
25b70 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
25b80 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
25b90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
25ba0 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
25bb0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
25bc0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
25bd0 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
25be0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
25bf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25c10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
25c20 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
25c30 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
25c40 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
25c50 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
25c60 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
25c70 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
25c80 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
25c90 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
25ca0 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
25cb0 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
25cc0 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
25cd0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
25ce0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
25cf0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
25d00 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
25d10 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
25d20 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
25d30 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
25d40 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
25d50 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
25d60 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
25d70 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
25d80 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
25d90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25da0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
25db0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
25dc0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
25dd0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
25de0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
25df0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
25e00 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
25e10 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
25e20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
25e30 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
25e40 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
25e50 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
25e60 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
25e70 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
25e80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
25e90 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
25ea0 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
25eb0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
25ec0 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
25ed0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
25ee0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
25ef0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
25f00 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
25f10 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
25f20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
25f30 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
25f40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25f50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
25f60 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
25f70 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
25f80 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
25f90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
25fa0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
25fb0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
25fc0 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
25fd0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
25fe0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
25ff0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
26000 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
26010 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
26020 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
26030 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
26040 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
26050 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
26060 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
26070 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
26080 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
26090 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
260a0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
260b0 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
260c0 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
260d0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
260e0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
260f0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
26100 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
26110 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
26120 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
26130 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
26140 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
26150 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
26160 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
26170 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
26180 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
26190 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
261a0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
261b0 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
261c0 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
261d0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
261e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
261f0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
26200 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
26210 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
26220 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
26230 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
26240 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
26250 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
26260 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
26270 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
26280 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
26290 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
262a0 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
262b0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
262c0 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
262d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
262e0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
262f0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
26300 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
26310 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
26320 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
26330 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
26340 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
26350 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
26360 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
26370 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
26380 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
26390 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
263a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
263b0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
263c0 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
263d0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
263e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
263f0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
26400 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
26410 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
26420 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
26430 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
26440 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
26450 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
26460 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
26470 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
26480 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
26490 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
264a0 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
264b0 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
264c0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
264d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
264e0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
264f0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
26500 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
26510 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26520 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
26530 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
26540 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
26550 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
26560 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26570 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
26580 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
26590 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
265a0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
265b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
265c0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
265d0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
265e0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
265f0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
26600 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
26610 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
26620 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
26630 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
26640 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
26650 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
26660 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
26670 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
26680 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
26690 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
266a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
266b0 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
266c0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
266d0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
266e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
266f0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
26700 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
26710 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
26720 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
26730 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26740 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
26750 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26760 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26770 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
26780 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
26790 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
267a0 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
267b0 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
267c0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
267d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
267e0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
267f0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
26800 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
26810 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
26820 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
26830 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
26840 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
26850 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
26860 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
26870 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
26880 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
26890 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
268a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
268b0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
268c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
268d0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
268e0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
268f0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
26900 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
26910 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
26920 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
26930 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
26940 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
26950 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
26960 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
26970 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
26980 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
26990 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
269a0 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
269b0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
269c0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
269d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
269e0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
269f0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
26a00 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
26a10 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
26a20 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
26a30 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
26a40 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
26a50 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
26a60 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
26a70 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
26a80 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
26a90 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
26aa0 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
26ab0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
26ac0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
26ad0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
26ae0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
26af0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
26b00 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
26b10 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
26b20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
26b30 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
26b40 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
26b50 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
26b60 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
26b70 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
26b80 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
26b90 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
26ba0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
26bb0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26be0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
26bf0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
26c00 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
26c10 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
26c20 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
26c30 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
26c40 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
26c50 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
26c60 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
26c70 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
26c80 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
26c90 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
26ca0 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
26cb0 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
26cc0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
26cd0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
26ce0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
26cf0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
26d00 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
26d10 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
26d20 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
26d30 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
26d40 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26d50 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
26d60 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
26d70 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
26d80 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
26d90 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
26da0 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
26db0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
26dc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
26dd0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
26de0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
26df0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
26e00 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
26e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
26e20 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
26e30 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
26e40 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
26e50 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
26e60 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
26e70 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
26e80 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
26e90 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
26ea0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
26eb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
26ec0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
26ed0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
26ee0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
26ef0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
26f00 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
26f10 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
26f20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
26f30 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
26f40 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
26f50 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
26f60 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
26f70 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
26f80 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
26f90 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
26fa0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
26fb0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
26fc0 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
26fd0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
26fe0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
26ff0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
27000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
27010 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
27020 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
27030 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
27040 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
27050 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
27060 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
27070 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
27080 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
27090 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
270a0 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
270b0 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
270c0 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
270d0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
270e0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
270f0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
27100 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
27110 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
27120 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
27130 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
27140 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
27150 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
27160 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
27170 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
27180 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
27190 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
271a0 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
271b0 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
271c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
271d0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
271e0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
271f0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
27200 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
27210 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
27220 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
27230 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
27240 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
27250 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
27260 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
27270 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
27280 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
27290 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
272a0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
272b0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
272c0 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
272d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
272e0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
272f0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
27300 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
27310 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
27320 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
27330 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
27340 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
27350 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
27360 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
27370 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
27380 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
27390 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
273a0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
273b0 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
273c0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
273d0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
273e0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
273f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
27400 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
27410 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
27420 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
27430 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
27440 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
27450 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
27460 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
27470 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
27480 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
27490 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
274a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
274b0 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
274c0 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
274d0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
274e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
274f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
27500 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
27510 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
27520 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
27530 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
27540 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
27550 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
27560 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
27570 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
27580 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
27590 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
275a0 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
275b0 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
275c0 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
275d0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
275e0 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
275f0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
27600 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
27610 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
27620 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
27630 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
27640 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
27650 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
27660 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
27670 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
27680 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
27690 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
276a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
276b0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
276c0 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
276d0 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
276e0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
276f0 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
27700 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
27710 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
27720 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
27730 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
27740 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
27750 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
27760 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
27770 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
27780 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
27790 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
277a0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
277b0 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
277c0 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
277d0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
277e0 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
277f0 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
27800 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
27810 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
27820 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
27830 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
27840 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
27850 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
27860 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
27870 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
27880 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
27890 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
278a0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
278b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
278c0 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
278d0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
278e0 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
278f0 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
27900 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
27910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
27920 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
27930 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
27940 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
27950 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
27960 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
27970 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
27980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
27990 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
279a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
279b0 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
279c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
279d0 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
279e0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
279f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
27a00 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
27a10 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
27a20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
27a30 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
27a40 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
27a50 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
27a60 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
27a70 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
27a80 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
27a90 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
27aa0 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
27ab0 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
27ac0 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
27ad0 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
27ae0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
27af0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
27b00 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
27b10 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
27b20 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
27b30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
27b40 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
27b50 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
27b60 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
27b70 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
27b80 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
27b90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
27ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27bb0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
27bc0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
27bd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
27be0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
27bf0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
27c00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
27c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27c20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27c30 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
27c40 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
27c50 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
27c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27c70 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
27c80 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
27c90 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
27ca0 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20  nce to a memory 
27cb0 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65  mapped page obje
27cc0 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ct for page numb
27cd0 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65  er pgno. .** The
27ce0 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c   new object will
27cf0 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72   use the pointer
27d00 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64   pData, obtained
27d10 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a   from xFetch()..
27d20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
27d30 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f  , set *ppPage to
27d40 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
27d50 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  w page reference
27d60 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53  .** and return S
27d70 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
27d80 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  ise, return an S
27d90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27da0 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50   and set.** *ppP
27db0 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  age to zero..**.
27dc0 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e 63  ** Page referenc
27dd0 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63  es obtained by c
27de0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
27df0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72  tion should be r
27e00 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61  eleased.** by ca
27e10 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61  lling pagerRelea
27e20 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  seMapPage()..*/.
27e30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
27e40 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a  AcquireMapPage(.
27e50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
27e80 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  t */.  Pgno pgno
27e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27ea0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
27eb0 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20  umber */.  void 
27ec0 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  *pData,         
27ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
27ee0 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66 6f  etch()'d data fo
27ef0 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
27f00 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20   PgHdr **ppPage 
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65   /* OUT: Acquire
27f30 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f  d page object */
27f40 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  .){.  PgHdr *p; 
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f60 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
27f70 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20 72  mapped page to r
27f80 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66  eturn */.  .  if
27f90 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  ( pPager->pMmapF
27fa0 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a  reelist ){.    *
27fb0 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61  ppPage = p = pPa
27fc0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27fd0 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
27fe0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
27ff0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
28000 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
28010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28020 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20  ->nExtra>=8 );. 
28030 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
28040 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65  tra, 0, 8);.  }e
28050 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
28060 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
28070 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
28080 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
28090 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
280a0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
280b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
280c0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
280d0 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
280e0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
280f0 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
28100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28110 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
28120 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
28130 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
28140 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
28150 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
28160 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
28170 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
28180 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
28190 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
281a0 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
281b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
281c0 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
281d0 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
281e0 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
281f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
28200 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
28210 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
28220 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
28230 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
28240 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
28250 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
28260 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
28270 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
28280 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
28290 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
282a0 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73  age pPg. pPg mus
282b0 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75  t have been retu
282c0 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65  rned by an .** e
282d0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70  arlier call to p
282e0 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
282f0 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
28300 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73  void pagerReleas
28310 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a  eMapPage(PgHdr *
28320 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
28330 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
28340 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ger;.  pPager->n
28350 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67  MmapOut--;.  pPg
28360 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
28370 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
28380 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  ;.  pPager->pMma
28390 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b  pFreelist = pPg;
283a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
283b0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
283c0 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b  ->iVersion>=3 );
283d0 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65  .  sqlite3OsUnfe
283e0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
283f0 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
28400 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
28410 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  ize, pPg->pData)
28420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
28430 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74  all PgHdr object
28440 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
28450 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c  Pager.pMmapFreel
28460 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ist list..*/.sta
28470 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
28480 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20  eeMapHdrs(Pager 
28490 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
284a0 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70  r *p;.  PgHdr *p
284b0 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50  Next;.  for(p=pP
284c0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
284d0 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ist; p; p=pNext)
284e0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
284f0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c  >pDirty;.    sql
28500 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
28510 7d 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  }.}../* Verify t
28520 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
28530 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
28540 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
28550 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
28560 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
28570 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
28580 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
28590 73 65 20 69 73 20 73 74 69 6c 6c 20 77 68 65 72  se is still wher
285a0 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f  e it ought.** to
285b0 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65   be on disk.  Re
285c0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53  turn non-zero (S
285d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
285e0 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f  BMOVED or some o
285f0 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  ther error.** co
28600 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  de from sqlite3O
28610 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68  sAccess()) if th
28620 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67  e database has g
28630 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a  one missing..*/.
28640 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62  static int datab
28650 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67  aseIsUnmoved(Pag
28660 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
28670 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30  nt bHasMoved = 0
28680 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
28690 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
286a0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
286b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
286c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
286d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
286e0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
286f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
28700 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  && pPager->zFile
28710 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20  name[0] );.  rc 
28720 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
28730 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
28740 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
28750 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73  HAS_MOVED, &bHas
28760 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63  Moved);.  if( rc
28770 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
28780 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  D ){.    /* If t
28790 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c  he HAS_MOVED fil
287a0 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69  e-control is uni
287b0 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75  mplemented, assu
287c0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
287d0 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
287e0 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61  been moved.  Tha
287f0 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69  t is the histori
28800 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20  cal behavior of 
28810 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f  SQLite: prior to
28820 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
28830 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20  3.8.3, it never 
28840 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72  checked */.    r
28850 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28860 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
28870 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73  QLITE_OK && bHas
28880 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20  Moved ){.    rc 
28890 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
288a0 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20  Y_DBMOVED;.  }. 
288b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
288c0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
288d0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
288e0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
288f0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
28900 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
28910 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
28920 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
28930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28940 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
28950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
28960 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
28970 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
28980 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
28990 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
289a0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
289b0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
289c0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
289d0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
289e0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
289f0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
28a00 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
28a10 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
28a20 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
28a30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
28a40 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
28a50 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
28a60 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
28a70 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
28a80 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
28a90 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
28aa0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
28ab0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
28ac0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
28ad0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
28ae0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
28af0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
28b00 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
28b10 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
28b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
28b30 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
28b40 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  , sqlite3 *db){.
28b50 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
28b60 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
28b70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ace;.  assert( d
28b80 62 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  b || pagerUseWal
28b90 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
28ba0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
28bb0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
28bc0 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
28bd0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
28be0 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
28bf0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
28c00 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65  oc();.  pagerFre
28c10 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72 29  eMapHdrs(pPager)
28c20 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
28c30 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
28c40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
28c50 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
28c60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28c70 57 41 4c 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a  WAL.  {.    u8 *
28c80 61 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  a = 0;.    asser
28c90 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d  t( db || pPager-
28ca0 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >pWal==0 );.    
28cb0 69 66 28 20 64 62 20 26 26 20 30 3d 3d 28 64 62  if( db && 0==(db
28cc0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
28cd0 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20  _NoCkptOnClose) 
28ce0 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
28cf0 4f 4b 3d 3d 64 61 74 61 62 61 73 65 49 73 55 6e  OK==databaseIsUn
28d00 6d 6f 76 65 64 28 70 50 61 67 65 72 29 0a 20 20  moved(pPager).  
28d10 20 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70    ){.      a = p
28d20 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Tmp;.    }.    s
28d30 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
28d40 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c  Pager->pWal, db,
28d50 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
28d60 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
28d70 61 67 65 53 69 7a 65 2c 61 29 3b 0a 20 20 20 20  ageSize,a);.    
28d80 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
28d90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
28da0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
28db0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
28dc0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
28dd0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
28de0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
28df0 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
28e00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28e10 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
28e20 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
28e30 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
28e40 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
28e50 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
28e60 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
28e70 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
28e80 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
28e90 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
28ea0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
28eb0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
28ec0 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
28ed0 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
28ee0 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
28ef0 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
28f00 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
28f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
28f20 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
28f30 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
28f40 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
28f50 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
28f60 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
28f70 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
28f80 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
28f90 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
28fa0 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
28fb0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
28fc0 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
28fd0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
28fe0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
28ff0 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
29000 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
29010 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
29020 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
29030 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
29040 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
29050 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
29060 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
29070 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
29080 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
29090 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
290a0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
290b0 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
290c0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
290d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
290e0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
290f0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
29100 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
29110 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
29120 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
29130 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
29140 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
29150 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
29160 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
29170 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
29180 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
29190 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
291a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
291b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
291c0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
291d0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
291e0 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
291f0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
29200 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
29210 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
29220 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
29230 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
29240 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
29250 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
29260 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
29270 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
29280 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
29290 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
292a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
292b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
292c0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
292d0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
292e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
292f0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
29300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
29310 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
29320 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
29330 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
29340 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
29350 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
29360 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
29370 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
29380 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
29390 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
293a0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
293b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
293c0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
293d0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
293e0 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
293f0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
29400 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
29410 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
29420 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
29430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
29440 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
29450 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
29460 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
29470 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
29480 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
29490 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
294a0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
294b0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
294c0 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
294d0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
294e0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
294f0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
29500 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
29510 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
29520 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
29530 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
29540 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
29550 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
29560 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
29570 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
29580 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
29590 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
295a0 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  cs of the file-s
295b0 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
295c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
295d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
295e0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
295f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
29600 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
29610 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
29620 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
29630 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
29640 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
29650 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
29660 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
29670 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
29680 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
29690 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
296a0 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
296b0 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
296c0 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
296d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
296e0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
296f0 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
29700 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
29710 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
29720 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
29730 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
29740 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
29750 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
29760 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
29770 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
29780 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
29790 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
297a0 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
297b0 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
297c0 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
297d0 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
297e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
297f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
29800 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
29810 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
29820 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
29830 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
29840 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
29850 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
29860 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
29870 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
29880 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
29890 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
298a0 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
298b0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
298c0 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
298d0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
298e0 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
298f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
29900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
29910 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
29920 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
29930 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
29940 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
29950 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
29960 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
29970 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
29980 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
29990 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
299a0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
299b0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
299c0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
299d0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
299e0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
299f0 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20   int newHdr){.  
29a00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29a30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
29a40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29a50 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
29a60 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
29a70 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29a80 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
29a90 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
29aa0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
29ab0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
29ac0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
29ad0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
29ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29af0 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
29b00 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
29b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29b20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29b30 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
29b40 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
29b50 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
29b60 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
29b70 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
29b80 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
29b90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
29ba0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29bb0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
29bc0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
29bd0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
29be0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
29bf0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
29c00 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
29c10 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29c20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
29c30 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
29c40 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
29c50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
29c60 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
29c70 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
29c80 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
29c90 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
29ca0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
29cb0 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
29cc0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
29cd0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
29ce0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
29cf0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
29d00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29d10 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
29d20 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
29d30 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
29d40 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
29d50 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
29d60 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
29d70 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
29d80 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
29d90 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
29da0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
29db0 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
29dc0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
29dd0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
29de0 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
29df0 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
29e00 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
29e10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
29e20 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
29e30 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
29e40 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
29e50 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
29e60 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
29e70 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
29e80 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
29e90 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
29ea0 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
29eb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
29ec0 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
29ed0 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
29ee0 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
29ef0 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
29f00 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
29f10 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
29f20 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
29f30 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
29f40 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
29f50 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
29f60 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
29f70 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
29f80 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
29f90 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
29fa0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
29fb0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
29fc0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
29fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
29fe0 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
29ff0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
2a000 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
2a010 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
2a020 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
2a030 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
2a040 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
2a050 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
2a060 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
2a070 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
2a080 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
2a090 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
2a0a0 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
2a0b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2a0c0 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
2a0d0 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
2a0e0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
2a0f0 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
2a100 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
2a110 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
2a120 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
2a130 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
2a140 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
2a150 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
2a160 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
2a170 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
2a180 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
2a190 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
2a1a0 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
2a1b0 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
2a1c0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
2a1d0 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
2a1e0 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
2a1f0 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
2a200 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
2a210 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
2a220 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
2a230 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
2a240 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
2a250 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
2a260 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
2a270 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
2a280 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2a290 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
2a2a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
2a2b0 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
2a2c0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
2a2d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
2a2e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2a2f0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
2a300 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
2a310 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
2a320 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a330 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
2a340 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
2a350 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
2a360 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
2a370 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
2a380 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2a390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a3a0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
2a3b0 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
2a3c0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
2a3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a3e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a3f0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
2a400 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2a410 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
2a420 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a430 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2a440 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
2a450 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
2a460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
2a470 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
2a480 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
2a490 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
2a4a0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2a4b0 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
2a4c0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2a4d0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
2a4e0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
2a4f0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
2a500 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
2a510 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
2a520 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
2a530 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
2a540 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a550 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
2a560 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
2a570 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
2a580 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
2a590 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
2a5a0 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
2a5b0 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
2a5c0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
2a5d0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
2a5e0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
2a5f0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
2a600 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
2a610 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
2a620 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
2a630 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
2a640 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
2a650 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
2a660 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
2a670 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
2a680 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
2a690 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
2a6a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2a6b0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
2a6c0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
2a6d0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
2a6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
2a6f0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
2a700 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
2a710 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2a720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
2a730 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
2a740 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
2a750 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a760 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2a770 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
2a780 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
2a790 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a7a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a7b0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2a7c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2a7d0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
2a7e0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2a7f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
2a800 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a810 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
2a820 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a830 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
2a840 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
2a850 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2a860 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
2a870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a880 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a890 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a8a0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
2a8b0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
2a8c0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
2a8d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a8e0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
2a8f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2a900 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
2a910 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
2a920 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2a930 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a940 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
2a950 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
2a960 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
2a970 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
2a980 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
2a990 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
2a9a0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
2a9b0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
2a9c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a9d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a9e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2a9f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2aa00 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
2aa10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
2aa20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
2aa30 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
2aa40 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
2aa50 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
2aa60 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
2aa70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
2aa80 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
2aa90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
2aaa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2aab0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2aac0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2aad0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
2aae0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
2aaf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
2ab00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ab10 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
2ab20 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
2ab30 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
2ab40 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
2ab50 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
2ab60 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
2ab70 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
2ab80 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2ab90 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
2aba0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
2abb0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
2abc0 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
2abd0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
2abe0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2abf0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
2ac00 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
2ac10 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2ac20 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
2ac30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ac40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
2ac50 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
2ac60 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
2ac70 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
2ac80 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
2ac90 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
2aca0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
2acb0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
2acc0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
2acd0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
2ace0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
2acf0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ad00 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
2ad10 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
2ad20 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
2ad30 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
2ad40 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
2ad50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
2ad60 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2ad70 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
2ad80 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
2ad90 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
2ada0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
2adb0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
2adc0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
2add0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
2ade0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
2adf0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
2ae00 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
2ae10 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
2ae20 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
2ae30 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
2ae40 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2ae50 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
2ae60 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
2ae70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ae80 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
2ae90 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
2aea0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
2aeb0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
2aec0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
2aed0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
2aee0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
2aef0 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
2af00 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
2af10 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
2af20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
2af30 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
2af40 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
2af50 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
2af60 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
2af70 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2af80 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2af90 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
2afa0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
2afb0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
2afc0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
2afd0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
2afe0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2aff0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
2b000 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
2b010 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
2b020 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
2b030 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
2b040 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
2b050 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
2b060 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
2b070 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
2b080 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
2b090 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
2b0a0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
2b0b0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
2b0c0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
2b0d0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
2b0e0 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
2b0f0 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
2b100 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
2b110 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
2b120 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
2b130 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
2b140 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
2b150 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2b160 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2b170 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2b180 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2b190 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2b1a0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
2b1b0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2b1c0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
2b1d0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
2b1e0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
2b1f0 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
2b200 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
2b210 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2b220 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
2b230 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
2b240 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
2b250 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
2b260 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b280 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2b290 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2b2a0 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
2b2b0 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
2b2c0 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
2b2d0 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
2b2e0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
2b2f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b310 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
2b320 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2b330 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
2b340 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
2b350 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
2b360 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
2b370 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2b380 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2b390 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
2b3a0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
2b3b0 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
2b3c0 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
2b3d0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
2b3e0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
2b3f0 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
2b400 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
2b410 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2b420 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
2b430 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
2b440 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
2b450 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
2b460 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
2b470 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
2b480 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2b490 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
2b4a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
2b4b0 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
2b4c0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
2b4d0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
2b4e0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2b4f0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
2b500 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
2b510 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
2b520 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
2b530 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
2b540 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
2b550 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
2b560 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
2b570 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2b580 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2b590 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2b5a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b5b0 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
2b5c0 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
2b5d0 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
2b5e0 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
2b5f0 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
2b600 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2b610 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
2b620 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
2b630 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
2b640 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
2b650 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
2b660 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
2b670 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
2b680 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
2b690 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
2b6a0 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
2b6b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
2b6c0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
2b6d0 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
2b6e0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2b6f0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2b700 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
2b710 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
2b720 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2b730 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
2b740 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
2b750 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
2b760 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
2b770 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
2b780 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
2b790 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
2b7a0 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
2b7b0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
2b7c0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
2b7d0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
2b7e0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
2b7f0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
2b800 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
2b810 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
2b820 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
2b830 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
2b840 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
2b850 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
2b860 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
2b870 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
2b880 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
2b890 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2b8a0 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
2b8b0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
2b8c0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
2b8d0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
2b8e0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
2b8f0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
2b900 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
2b910 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
2b920 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
2b930 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
2b940 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2b950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b970 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
2b980 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
2b990 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
2b9a0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
2b9b0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2b9c0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2b9d0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
2b9e0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
2b9f0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
2ba00 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
2ba10 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2ba20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2ba30 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
2ba40 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
2ba50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2ba60 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  PT, pData);..   
2ba70 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
2ba80 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
2ba90 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2baa0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2bab0 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
2bac0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2bad0 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
2bae0 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
2baf0 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
2bb00 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
2bb10 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
2bb20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
2bb30 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
2bb40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2bb50 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
2bb60 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
2bb70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
2bb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2bb90 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
2bba0 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
2bbb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
2bbc0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
2bbd0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2bbe0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
2bbf0 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
2bc00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2bc10 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
2bc20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
2bc30 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2bc40 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2bc50 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
2bc60 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
2bc70 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
2bc80 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
2bc90 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
2bca0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
2bcb0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
2bcc0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2bcd0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
2bce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
2bcf0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
2bd00 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
2bd10 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
2bd20 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
2bd30 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
2bd40 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
2bd50 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2bd70 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2bd80 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
2bd90 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
2bda0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
2bdb0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
2bdc0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2bdd0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2bde0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2bdf0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
2be00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
2be10 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
2be20 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
2be30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2be40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
2be50 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
2be60 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
2be70 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
2be80 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
2be90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2bea0 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
2beb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2bec0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
2bed0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2bee0 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
2bef0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2bf00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
2bf10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2bf20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
2bf30 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
2bf40 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
2bf50 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
2bf60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2bf70 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2bf80 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2bf90 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2bfa0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2bfb0 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2bfc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2bfd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bfe0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2bff0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2c000 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2c010 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  gs =  SQLITE_OPE
2c020 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53  N_SUBJOURNAL | S
2c030 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2c040 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51  RITE .      | SQ
2c050 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2c060 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   | SQLITE_OPEN_E
2c070 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20  XCLUSIVE .      
2c080 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
2c090 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20  LETEONCLOSE;.   
2c0a0 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20   int nStmtSpill 
2c0b0 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
2c0c0 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
2c0d0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2c0e0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2c0f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2c100 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
2c110 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2c120 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20     nStmtSpill = 
2c130 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  -1;.    }.    rc
2c140 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2c150 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  lOpen(pPager->pV
2c160 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73  fs, 0, pPager->s
2c170 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d  jfd, flags, nStm
2c180 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  tSpill);.  }.  r
2c190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c1a0 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2c1b0 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2c1c0 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2c1d0 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2c1e0 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49  ournal. .**.** I
2c1f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2c200 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2c210 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2c220 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2c230 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2c240 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2c250 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2c260 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2c270 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2c280 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2c290 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2c2a0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2c2b0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2c2c0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2c2d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2c2e0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2c2f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2c300 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2c310 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2c320 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2c330 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2c340 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2c350 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2c360 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2c370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c380 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2c390 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2c3a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2c3b0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2c3c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2c3d0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2c3e0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2c3f0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2c400 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2c410 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2c420 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2c430 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2c440 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2c450 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2c460 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2c470 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2c480 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2c490 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2c4a0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2c4b0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2c4c0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2c4d0 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2c4e0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2c4f0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2c500 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2c510 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2c520 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2c530 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2c540 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2c550 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2c560 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2c570 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2c580 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2c590 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2c5a0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2c5b0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2c5c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2c5d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c5e0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2c5f0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2c600 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2c610 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2c620 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2c630 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2c640 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23 69  har *pData2;..#i
2c650 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2c660 45 43 20 20 20 0a 20 20 20 20 20 20 69 66 28 20  EC   .      if( 
2c670 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d  !pPager->subjInM
2c680 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20  emory ){.       
2c690 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2c6a0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2c6b0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2c6c0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
2c6d0 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d 65  Data2);.      }e
2c6e0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2c6f0 20 70 44 61 74 61 32 20 3d 20 70 44 61 74 61 3b   pData2 = pData;
2c700 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2c710 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2c720 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2c730 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2c740 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2c750 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2c760 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2c770 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2c780 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2c790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c7a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2c7b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2c7c0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2c7d0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2c7e0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2c7f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c800 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2c810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2c820 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2c830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2c840 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2c850 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2c860 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2c870 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2c880 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2c890 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2c8a0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2c8b0 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50  PageIfRequired(P
2c8c0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
2c8d0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2c8e0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72  ge(pPg) ){.    r
2c8f0 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c  eturn subjournal
2c900 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
2c910 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
2c920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
2c930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2c940 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2c950 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2c960 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2c970 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2c980 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2c990 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2c9a0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2c9b0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2c9c0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2c9d0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2c9e0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2c9f0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2ca00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2ca10 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2ca20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2ca30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ca40 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2ca50 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2ca60 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2ca70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2ca80 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2ca90 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2caa0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2cab0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2cac0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2cad0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2cae0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2caf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2cb00 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2cb10 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2cb20 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2cb30 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2cb40 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2cb50 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2cb60 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2cb70 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2cb80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2cb90 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2cba0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2cbb0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2cbc0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2cbd0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2cbe0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2cbf0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2cc00 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2cc10 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2cc20 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2cc30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2cc40 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2cc50 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2cc60 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2cc70 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2cc80 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2cc90 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2cca0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2ccb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2ccc0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2ccd0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2cce0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2ccf0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2cd00 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2cd10 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2cd20 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2cd30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2cd40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2cd50 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2cd60 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2cd70 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2cd80 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
2cd90 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
2cda0 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  it is set during
2cdb0 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
2cdc0 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
2cdd0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
2cde0 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
2cdf0 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
2ce00 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
2ce10 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
2ce20 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2ce30 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
2ce40 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
2ce50 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
2ce60 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
2ce70 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
2ce80 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
2ce90 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c   doNotSpill ROLL
2cea0 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74  BACK and OFF bit
2ceb0 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  s inhibits all c
2cec0 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20  ache spilling.  
2ced0 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ** regardless of
2cee0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2cef0 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2cf00 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2cf10 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72   during.  ** a r
2cf20 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73  ollback or by us
2cf30 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70  er request, resp
2cf40 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20  ectively..  **. 
2cf50 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2cf60 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2cf70 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2cf80 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2cf90 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2cfa0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2cfb0 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2cfc0 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2cfd0 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20  mentation it .  
2cfe0 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2cff0 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2d000 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2d010 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2d020 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77  teFlag==3.  ** w
2d030 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2d040 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2d050 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2d060 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2d070 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2d080 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2d090 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2d0a0 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2d0b0 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2d0c0 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2d0d0 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2d0e0 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2d0f0 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2d100 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2d110 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2d120 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2d130 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65  E_OK;.  testcase
2d140 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2d150 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2d160 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74  _ROLLBACK );.  t
2d170 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2d180 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2d190 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20  ILLFLAG_OFF );. 
2d1a0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2d1b0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2d1c0 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
2d1d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2d1e0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20  ->doNotSpill.   
2d1f0 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e  && ((pPager->doN
2d200 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c  otSpill & (SPILL
2d210 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50  FLAG_ROLLBACK|SP
2d220 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30  ILLFLAG_OFF))!=0
2d230 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
2d240 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
2d250 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29  ED_SYNC)!=0).  )
2d260 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d270 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2d280 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
2d290 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 5d 2b 2b  ER_STAT_SPILL]++
2d2a0 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ;.  pPg->pDirty 
2d2b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2d2c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2d2d0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2d2e0 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
2d2f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74  .    /* If the t
2d300 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
2d310 22 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e  "BEGIN CONCURREN
2d320 54 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  T" transaction, 
2d330 74 68 65 20 70 61 67 65 20 0a 20 20 20 20 2a 2a  the page .    **
2d340 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c 75 73 68   cannot be flush
2d350 65 64 20 74 6f 20 64 69 73 6b 2e 20 52 65 74 75  ed to disk. Retu
2d360 72 6e 20 65 61 72 6c 79 20 69 6e 20 74 68 69 73  rn early in this
2d370 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69 66   case. */.    if
2d380 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  ( pPager->pAllRe
2d390 61 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ad ) return SQLI
2d3a0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
2d3b0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2d3c0 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2d3d0 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2d3e0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
2d3f0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2d400 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20  fRequired(pPg); 
2d410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d430 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2d440 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2d450 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2d460 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66 64  }else{.    .#ifd
2d470 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2d480 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
2d490 49 54 45 0a 20 20 20 20 69 66 28 20 70 50 61 67  ITE.    if( pPag
2d4a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
2d4b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2d4c0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2d4d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
2d4e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d4f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2d500 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2d510 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d  ager, rc);.    }
2d520 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 2f  .#endif.  .    /
2d530 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2d540 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
2d550 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2d560 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2d570 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
2d580 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2d590 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2d5a0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
2d5b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
2d5c0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2d5d0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
2d5e0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2d5f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d600 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2d610 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2d620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2d640 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2d650 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2d660 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2d670 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2d680 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2d690 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2d6a0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2d6b0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2d6c0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2d6d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2d6e0 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2d6f0 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2d700 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2d710 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2d720 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2d730 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2d740 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2d750 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2d760 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  , rc); .}../*.**
2d770 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66   Flush all unref
2d780 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61  erenced dirty pa
2d790 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
2d7a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2d7b0 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61  Flush(Pager *pPa
2d7c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2d7d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d7e0 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
2d7f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69  {.    PgHdr *pLi
2d800 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
2d810 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2d820 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2d830 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2d840 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2d850 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c  ger) );.    whil
2d860 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2d870 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2d880 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
2d890 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2d8a0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2d8b0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2d8c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2d8d0 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61  tress((void*)pPa
2d8e0 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ger, pList);.   
2d8f0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74     }.      pList
2d900 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
2d910 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2d920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2d930 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2d940 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
2d950 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
2d960 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
2d970 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
2d980 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
2d990 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
2d9a0 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
2d9b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
2d9c0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
2d9d0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
2d9e0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2d9f0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
2da00 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2da10 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
2da20 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
2da30 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
2da40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2da50 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
2da60 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
2da70 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
2da80 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
2da90 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
2daa0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2dab0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
2dac0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
2dad0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
2dae0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
2daf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
2db00 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
2db10 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2db20 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
2db30 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
2db40 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
2db50 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2db60 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
2db70 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
2db80 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
2db90 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
2dba0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
2dbb0 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
2dbc0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
2dbd0 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
2dbe0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2dbf0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
2dc00 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2dc10 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57 68  Extra() API.  Wh
2dc20 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69 73  en a new page is
2dc30 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a   allocated, the.
2dc40 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65 73  ** first 8 bytes
2dc50 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20 61   of this space a
2dc60 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68  re zeroed but th
2dc70 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75  e remainder is u
2dc80 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a  ninitialized..**
2dc90 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61 63   (The extra spac
2dca0 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74 72  e is used by btr
2dcb0 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67  ee as the MemPag
2dcc0 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a  e object.).**.**
2dcd0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
2dce0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
2dcf0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
2dd00 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2dd10 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2dd20 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2dd30 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2dd40 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2dd50 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2dd60 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  the PAGER_* flag
2dd70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
2dd80 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
2dd90 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
2dda0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
2ddb0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
2ddc0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
2ddd0 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
2dde0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
2ddf0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
2de00 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2de10 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2de20 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
2de30 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
2de40 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
2de50 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
2de60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2de70 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
2de80 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
2de90 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
2dea0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2deb0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
2dec0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
2ded0 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
2dee0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
2def0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2df00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
2df10 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
2df20 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
2df30 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
2df40 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2df50 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
2df60 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
2df70 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
2df80 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
2df90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2dfa0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
2dfb0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
2dfc0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
2dfd0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
2dfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2dff0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
2e000 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
2e010 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2e020 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
2e030 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2e040 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2e050 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
2e060 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
2e070 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
2e080 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
2e090 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2e0a0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e0c0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
2e0d0 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
2e0e0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
2e0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2e100 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
2e110 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
2e120 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
2e130 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
2e140 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
2e150 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
2e160 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
2e170 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
2e180 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
2e190 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2e1a0 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
2e1b0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
2e1c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2e1d0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
2e1e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2e1f0 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
2e200 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e210 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
2e220 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
2e230 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
2e240 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
2e250 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e260 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2e270 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 23 69 66  mory file */.#if
2e280 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2e290 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20  E_DESERIALIZE.  
2e2a0 69 6e 74 20 6d 65 6d 4a 4d 20 3d 20 30 3b 20 20  int memJM = 0;  
2e2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
2e2c0 72 79 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ry journal mode 
2e2d0 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
2e2e0 65 20 6d 65 6d 4a 4d 20 30 0a 23 65 6e 64 69 66  e memJM 0.#endif
2e2f0 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2e300 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2e310 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2e320 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2e330 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2e340 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2e350 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2e360 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2e370 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2e380 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2e390 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2e3a0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2e3b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2e3c0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2e3d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2e3e0 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2e3f0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2e400 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2e410 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2e420 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2e430 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2e440 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2e450 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2e460 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2e470 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2e480 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2e490 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2e4a0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2e4b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e4c0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2e4d0 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2e4e0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2e4f0 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2e500 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2e510 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2e520 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e530 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2e540 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2e550 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2e560 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2e570 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2e580 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2e590 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2e5a0 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2e5b0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2e5c0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2e5d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2e5e0 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c   */.  journalFil
2e5f0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2e600 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2e610 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20  e(pVfs));..  /* 
2e620 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2e630 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2e640 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2e650 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2e660 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2e670 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e680 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2e690 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2e6a0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2e6b0 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2e6c0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2e6d0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2e6e0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2e6f0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2e700 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2e710 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2e720 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2e730 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2e740 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2e750 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2e760 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2e770 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2e780 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2e790 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2e7a0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2e7b0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2e7c0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2e7d0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2e7e0 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2e7f0 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2e800 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2e810 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2e820 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2e830 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2e840 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2e850 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2e860 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2e870 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2e880 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e890 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2e8a0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2e8b0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2e8c0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2e8d0 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2e8e0 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2e8f0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2e900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e910 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2e920 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  PT;.    }.    zP
2e930 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2e940 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2e950 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2e960 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2e970 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2e980 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2e990 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2e9a0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2e9b0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2e9c0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2e9d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e9e0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2e9f0 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2ea00 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2ea10 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2ea20 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2ea30 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2ea40 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2ea50 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2ea60 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ea70 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2ea80 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2ea90 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2eaa0 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2eab0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2eac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2ead0 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2eae0 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2eaf0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2eb00 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2eb10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2eb20 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2eb30 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2eb40 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2eb50 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2eb60 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2eb70 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2eb80 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2eb90 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2eba0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2ebb0 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2ebc0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2ebd0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2ebe0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2ebf0 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2ec00 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2ec10 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2ec20 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2ec30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2ec40 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2ec50 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2ec60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ec70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2ec80 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2ec90 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2eca0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ecb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2ecc0 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2ecd0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2ece0 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2ecf0 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2ed00 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2ed10 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2ed20 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2ed30 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2ed40 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2ed50 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2ed60 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2ed70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2ed80 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2eda0 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2edb0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2edc0 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2ede0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2edf0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2ee00 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2ee10 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2ee20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2ee30 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2ee40 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2ee50 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2ee60 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2ee70 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2ee80 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2ee90 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2eea0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2eeb0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2eec0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2eed0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2eee0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2eef0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2ef00 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2ef10 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2ef20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2ef30 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2ef40 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2ef50 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2ef60 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2ef70 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2ef80 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2ef90 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2efa0 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2efb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2efc0 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2efd0 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2efe0 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2eff0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2f000 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2f010 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2f020 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2f030 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2f040 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2f050 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2f060 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2f070 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2f080 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f0a0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2f0b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f0c0 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2f0d0 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2f0e0 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2f0f0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2f100 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2f110 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2f120 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2f130 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2f140 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2f150 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2f160 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2f170 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2f180 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2f190 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  T;.  }.  pPager 
2f1a0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2f1b0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2f1c0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2f1d0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2f1e0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2f1f0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2f200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2f210 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2f220 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2f230 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2f240 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2f250 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2f260 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2f270 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2f280 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2f290 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2f2a0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2f2b0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2f2c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f2d0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2f2e0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2f2f0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2f300 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2f310 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2f320 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2f330 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2f340 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2f350 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2f360 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2f370 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2f380 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2f390 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2f3a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2f3b0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2f3c0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2f3d0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2f3e0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2f3f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2f400 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2f410 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2f420 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2f430 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f440 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2f450 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2f460 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2f470 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2f480 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2f490 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2f4a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2f4b0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2f4c0 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2f4d0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2f4e0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2f4f0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2f500 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2f510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f520 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2f530 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2f540 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2f550 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2f560 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2f570 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2f580 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2f590 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2f5a0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2f5b0 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2f5c0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2f5d0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2f5e0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2f5f0 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2f600 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2f610 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2f620 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2f630 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2f640 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2f650 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2f660 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2f670 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2f680 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2f690 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2f6a0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6c0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2f6d0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2f6e0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2f6f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2f700 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2f710 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2f720 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2f730 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2f740 20 21 6d 65 6d 44 62 20 29 3b 0a 23 69 66 64 65   !memDb );.#ifde
2f750 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f760 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20  DESERIALIZE.    
2f770 6d 65 6d 4a 4d 20 3d 20 28 66 6f 75 74 26 53 51  memJM = (fout&SQ
2f780 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
2f790 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20  )!=0;.#endif.   
2f7a0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
2f7b0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2f7c0 41 44 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20  ADONLY)!=0;..   
2f7d0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2f7e0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2f7f0 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2f800 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2f810 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2f820 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2f830 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2f840 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2f850 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2f860 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2f870 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2f880 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2f890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2f8a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2f8b0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2f8c0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2f8d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2f8e0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2f8f0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2f900 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2f910 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2f920 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2f930 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2f940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f950 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2f960 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2f970 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2f980 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2f990 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2f9a0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2f9b0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2f9c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2f9d0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2f9e0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2f9f0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2fa00 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2fa10 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2fa20 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2fa30 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2fa40 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2fa50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2fa60 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2fa70 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2fa80 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2fa90 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2faa0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2fab0 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2fac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2fad0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2fae0 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2faf0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2fb00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2fb10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2fb20 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2fb30 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2fb40 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2fb50 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2fb60 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2fb70 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2fb80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2fb90 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2fba0 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2fbb0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2fbc0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2fbd0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2fbe0 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2fbf0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2fc00 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2fc10 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2fc20 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2fc30 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2fc40 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2fc50 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2fc60 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2fc70 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2fc80 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2fc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fca0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2fcb0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2fcc0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2fcd0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2fce0 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2fcf0 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2fd00 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2fd10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2fd20 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2fd30 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2fd40 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2fd50 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2fd60 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2fd70 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2fd80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2fd90 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2fda0 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2fdb0 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2fdc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2fdd0 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2fde0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2fdf0 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2fe00 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2fe10 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2fe20 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2fe30 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2fe40 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2fe50 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2fe60 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2fe70 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2fe80 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2fe90 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2fea0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2feb0 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2fec0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2fed0 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2fee0 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2fef0 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2ff00 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2ff10 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2ff20 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2ff30 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2ff40 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2ff50 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2ff60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2ff70 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2ff80 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2ff90 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2ffa0 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2ffb0 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2ffc0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2ffd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2ffe0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2fff0 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
30000 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
30010 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
30020 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
30030 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
30040 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
30050 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
30060 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
30070 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
30080 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
30090 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
300a0 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
300b0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
300c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
300d0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
300e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
300f0 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
30100 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
30110 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
30120 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
30130 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
30140 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
30150 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
30160 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
30170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30180 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
30190 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
301a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
301b0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
301c0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
301d0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
301e0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
301f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
30200 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
30210 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
30220 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
30230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30240 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
30250 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61  8(nExtra);.    a
30260 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38  ssert( nExtra>=8
30270 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20   && nExtra<1000 
30280 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
30290 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
302a0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
302b0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302d0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
302e0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
302f0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
30300 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
30310 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
30320 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
30330 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
30340 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
30350 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
30360 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
30370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
30380 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
30390 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
303a0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
303b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
303c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
303d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
303e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
303f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
30400 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
30410 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
30420 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
30430 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
30440 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
30450 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
30460 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
30470 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
30480 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
30490 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
304a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
304b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
304c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
304d0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
304e0 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
304f0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
30500 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
30510 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
30520 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
30530 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
30540 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
30550 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
30560 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
30570 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
30580 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
30590 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
305a0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
305b0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
305c0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
305d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
305e0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
305f0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30600 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
30610 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
30620 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30630 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
30640 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
30650 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
30660 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
30670 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
30680 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
30690 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
306a0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
306b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
306c0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
306d0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
306e0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
306f0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
30700 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
30710 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
30720 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
30730 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
30740 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30750 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
30760 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
30770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
30780 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
30790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
307a0 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b  >extraSync==0 );
307b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
307c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
307d0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
307e0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
307f0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
30800 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
30810 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
30820 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
30830 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
30840 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
30850 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
30860 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
30870 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
30880 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
30890 4d 41 4c 20 7c 20 28 53 51 4c 49 54 45 5f 53 59  MAL | (SQLITE_SY
308a0 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32 29 3b 0a 20  NC_NORMAL<<2);. 
308b0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
308c0 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
308d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
308e0 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
308f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
30900 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
30910 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
30920 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
30930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
30940 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
30950 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
30960 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
30970 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
30980 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
30990 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
309a0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
309b0 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
309c0 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
309d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
309e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
309f0 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
30a00 66 28 20 6d 65 6d 44 62 20 7c 7c 20 6d 65 6d 4a  f( memDb || memJ
30a10 4d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  M ){.    pPager-
30a20 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
30a30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30a40 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
30a50 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
30a60 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
30a70 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
30a80 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
30a90 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
30aa0 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
30ab0 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d 65  t;.  setGetterMe
30ac0 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
30ad0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
30ae0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
30af0 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
30b00 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
30b10 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  er->szMmap = SQL
30b20 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
30b30 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65  _SIZE // will be
30b40 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
30b50 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
30b60 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
30b70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30b80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30b90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30ba0 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
30bb0 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
30bc0 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
30bd0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
30be0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
30bf0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
30c00 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
30c10 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30c20 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
30c30 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
30c40 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
30c50 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
30c60 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
30c70 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
30c80 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
30c90 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
30ca0 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
30cb0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
30cc0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
30cd0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
30ce0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
30cf0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
30d00 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
30d10 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
30d20 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
30d30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30d40 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
30d50 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
30d60 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
30d70 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
30d80 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
30d90 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
30da0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
30db0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
30dc0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
30dd0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
30de0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
30df0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30e00 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
30e10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
30e20 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
30e30 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
30e40 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
30e50 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
30e60 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
30e70 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
30e80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
30e90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
30ea0 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
30eb0 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
30ec0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
30ed0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
30ee0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
30ef0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
30f00 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
30f10 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
30f20 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
30f30 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
30f40 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30f50 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
30f60 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
30f70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
30f80 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
30f90 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
30fa0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
30fb0 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
30fc0 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
30fd0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
30fe0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
30ff0 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
31000 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
31010 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
31020 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
31030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
31040 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
31050 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
31060 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
31070 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
31080 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
31090 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
310a0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
310b0 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
310c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
310d0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
310e0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
310f0 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
31100 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
31110 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
31120 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
31130 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
31140 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
31150 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
31160 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
31170 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
31180 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
31190 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
311a0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
311b0 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
311c0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
311d0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
311e0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
311f0 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
31200 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
31210 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
31220 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
31230 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31240 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
31250 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
31260 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31280 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
31290 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
312a0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
312b0 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
312c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
312d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
312e0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
312f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
31300 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
31310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31330 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
31340 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
31350 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
31360 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
31370 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
31380 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
31390 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
313a0 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
313b0 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
313c0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
313d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
313e0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
313f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31400 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
31410 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
31420 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
31430 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
31440 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
31450 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
31460 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31470 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
31480 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
31490 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
314a0 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
314b0 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
314c0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
314d0 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
314e0 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
314f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
31500 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
31510 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
31520 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
31530 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
31540 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
31550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
31560 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
31570 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
31580 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
31590 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
315a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
315b0 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
315c0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
315d0 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
315e0 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
315f0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
31600 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
31610 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
31620 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
31630 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
31640 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
31650 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
31660 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
31670 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
31680 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
31690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
316a0 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
316b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
316c0 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
316d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
316e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
316f0 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
31700 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
31710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31720 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
31730 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31750 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
31760 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
31770 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
31780 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
31790 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
317a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
317b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
317c0 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70  tabase is zero p
317d0 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ages in size, th
317e0 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  at means that ei
317f0 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20  ther (1) the.   
31800 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31810 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f  is a remnant fro
31820 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61  m a prior databa
31830 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
31840 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20   name where.    
31850 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
31860 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74  ase file but not
31870 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
31880 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29   deleted, or (2)
31890 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20   the initial.   
318a0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
318b0 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74  ion that populat
318c0 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  es a new databas
318d0 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
318e0 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  d back..        
318f0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
31900 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
31910 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74  ile can be delet
31920 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61  ed.  However, ta
31930 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20  ke care.        
31940 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65  ** not to delete
31950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31960 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
31970 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20  dy open due to. 
31980 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
31990 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a  l_mode=PERSIST..
319a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
319b0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
319c0 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  && !jrnlOpen ){.
319d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
319e0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
319f0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
31a00 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
31a10 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
31a20 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
31a30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
31a40 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
31a50 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31a60 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
31a70 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
31a80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31a90 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
31aa0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
31ab0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
31ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31ad0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
31ae0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31b00 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
31b10 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
31b20 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
31b30 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
31b40 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
31b50 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
31b60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31b70 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
31b80 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
31b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
31ba0 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
31bb0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
31bc0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
31bd0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
31be0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
31bf0 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
31c00 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
31c10 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
31c20 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
31c30 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
31c40 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
31c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
31c60 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31c70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
31c80 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
31c90 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
31ca0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
31cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
31cc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
31cd0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31ce0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31cf0 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
31d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31d10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31d30 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
31d40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
31d50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
31d60 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
31d70 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
31d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31da0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
31db0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
31dc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
31dd0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
31de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31df0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
31e00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31e10 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
31e20 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
31e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31e40 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
31e50 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
31e60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
31e70 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
31e80 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
31e90 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
31ea0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
31eb0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
31ec0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
31ed0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
31ee0 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20  * it has a zero 
31ef0 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
31f00 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
31f10 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
31f20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
31f30 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
31f40 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
31f50 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
31f60 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
31f70 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
31f80 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
31f90 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
31fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
31fb0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
31fc0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
31fd0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
31fe0 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
31ff0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
32000 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
32010 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
32020 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
32030 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
32040 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
32050 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
32060 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
32070 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
32080 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
32090 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
320a0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
320b0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
320c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
320d0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
320e0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
320f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32100 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
32110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32120 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
32130 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
32140 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32150 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
32160 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
32170 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32180 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
32190 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
321a0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  ll sqlite3PagerG
321b0 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  et() until after
321c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
321d0 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
321e0 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
321f0 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
32200 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
32210 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
32220 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
32230 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
32240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
32250 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
32260 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
32270 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
32280 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
32290 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
322a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
322b0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e  ER_OPEN state (n
322c0 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
322d0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
322e0 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
322f0 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
32300 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
32310 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
32320 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32330 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
32340 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
32350 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
32360 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
32370 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
32380 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
32390 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
323a0 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
323b0 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
323c0 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
323d0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
323e0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
323f0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
32400 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
32410 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
32420 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
32430 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
32440 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
32450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
32460 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
32470 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
32480 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
32490 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
324a0 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
324b0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
324c0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
324d0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
324e0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
324f0 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
32500 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
32510 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
32520 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
32530 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
32540 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
32550 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
32560 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
32570 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
32580 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
32590 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
325a0 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
325b0 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
325c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
325d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
325e0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
325f0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
32600 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
32610 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
32620 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
32630 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
32640 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
32650 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
32660 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e  le or .** rollin
32670 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
32680 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
32690 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
326a0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
326b0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
326c0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
326d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
326e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
326f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
32700 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
32710 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
32720 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
32730 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
32740 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
32750 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
32760 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ding pages. This
32770 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
32780 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68  e pager state sh
32790 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a  ould either.  **
327a0 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44   be OPEN or READ
327b0 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e  ER. READER is on
327c0 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
327d0 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77  he pager is or w
327e0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c  as in .  ** excl
327f0 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
32800 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
32810 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
32820 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
32830 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
32840 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
32850 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
32860 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
32870 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32880 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
32890 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
328a0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
328b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
328c0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
328d0 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 61  OK );..  if( !pa
328e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
328f0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
32900 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32910 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
32920 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
32930 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
32940 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
32950 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
32960 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
32970 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
32980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
32990 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
329a0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
329b0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
329c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
329d0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
329e0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
329f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32a10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32a20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
32a30 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
32a40 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
32a50 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
32a60 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
32a70 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
32a80 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
32a90 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
32aa0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
32ab0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
32ac0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
32ad0 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
32ae0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
32af0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
32b00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
32b10 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  >eLock<=SHARED_L
32b20 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
32b30 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
32b40 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75  pPager, &bHotJou
32b50 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
32b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
32b80 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
32b90 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e     if( bHotJourn
32ba0 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
32bb0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
32bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32bd0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
32be0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
32bf0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32c00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
32c10 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
32c20 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
32c30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
32c40 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
32c50 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
32c60 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
32c70 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
32c80 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
32c90 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
32ca0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
32cb0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
32cc0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
32cd0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
32ce0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
32cf0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
32d00 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
32d10 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
32d20 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
32d30 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
32d40 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
32d50 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
32d60 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
32d70 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
32d80 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
32d90 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
32da0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
32db0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
32dc0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
32dd0 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
32de0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
32df0 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
32e00 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
32e10 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
32e20 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
32e30 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
32e40 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
32e50 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
32e60 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
32e70 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
32e80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32e90 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
32ea0 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    ** Unless the 
32eb0 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b  pager is in lock
32ec0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
32ed0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ve mode, the loc
32ee0 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  k is.      ** do
32ef0 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52  wngraded to SHAR
32f00 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74  ED_LOCK before t
32f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
32f20 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  urns..      */. 
32f30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
32f40 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
32f50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
32f60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32f80 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32f90 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
32fa0 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
32fb0 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20  lready open and 
32fc0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
32fd0 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68  on disk, open th
32fe0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
32ff0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
33000 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65  te access. Write
33010 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69   access is requi
33020 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20  red because .   
33030 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69     ** in exclusi
33040 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
33050 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
33060 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
33070 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  open .      ** a
33080 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  nd possibly used
33090 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
330a0 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73  on later on. Als
330b0 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20  o, write-access 
330c0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75  .      ** is usu
330d0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f  ally required to
330e0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
330f0 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c  urnal in journal
33100 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20  _mode=persist . 
33110 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e       ** mode (an
33120 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e  d also for journ
33130 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
33140 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
33150 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
33160 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    ** If the jour
33170 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
33180 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
33190 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
331a0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
331b0 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
331c0 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
331d0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
331e0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
331f0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
33200 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
33210 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
33220 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a   Or, it .      *
33230 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
33240 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
33250 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
33260 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
33270 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
33280 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
33290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
332a0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
332b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
332c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
332d0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
332e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
332f0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
33300 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20  r->pVfs;.       
33310 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20   int bExists;   
33320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
33330 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
33340 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
33350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33360 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
33370 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
33380 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
33390 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
333a0 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a  STS, &bExists);.
333b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
333c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
333d0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
333e0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
333f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
33400 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
33410 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
33420 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
33430 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
33440 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
33450 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
33460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33470 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
33480 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
33490 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
334a0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
334b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
334c0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
334d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
334e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
334f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
33500 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
33510 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
33520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33530 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33540 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  T;.            s
33550 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
33560 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
33570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33580 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  }.      }. .    
33590 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
335a0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
335b0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
335c0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
335d0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
335e0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
335f0 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
33600 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
33610 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
33620 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
33630 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
33640 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
33650 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
33660 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
33670 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
33680 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
33690 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
336a0 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
336b0 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
336c0 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
336d0 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
336e0 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
336f0 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
33700 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
33710 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
33720 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
33730 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
33740 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
33750 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
33760 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
33770 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
33780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
33790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
337a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
337b0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
337c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
337d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
337e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
337f0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
33800 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50 61  ack(pPager, !pPa
33810 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
33820 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
33830 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33840 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d  _OPEN;.        }
33850 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33860 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
33870 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
33880 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
33890 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
338a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LOCK);.      }..
338b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
338c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
338d0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
338e0 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e  h is taken if an
338f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
33900 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  ile trying to op
33910 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  en.        ** or
33920 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74   roll back a hot
33930 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68  -journal while h
33940 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
33950 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
33960 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75        ** pager_u
33970 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  nlock() routine 
33980 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62  will be called b
33990 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
339a0 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  to unlock.      
339b0 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49    ** the file. I
339c0 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74  f the unlock att
339d0 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  empt fails, then
339e0 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73   Pager.eLock mus
339f0 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
33a00 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
33a10 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d  OCK (see the com
33a20 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
33a30 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20  define for .    
33a40 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c      ** UNKNOWN_L
33a50 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e  OCK above for an
33a60 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a   explanation). .
33a70 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
33a80 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
33a90 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f  o get pager_unlo
33aa0 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c  ck() to do this,
33ab0 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74   set Pager.eStat
33ac0 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
33ad0 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e  PAGER_ERROR now.
33ae0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
33af0 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73  ually counted as
33b00 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20   a transition.  
33b10 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f        ** to ERRO
33b20 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73  R state in the s
33b30 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20  tate diagram at 
33b40 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
33b50 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  file,.        **
33b60 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
33b70 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c  hat the same cal
33b80 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
33b90 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20  k() will very.  
33ba0 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79        ** shortly
33bb0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
33bc0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  pager object to 
33bd0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
33be0 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20  Calling.        
33bf0 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ** assert_pager_
33c00 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61  state() would fa
33c10 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68  il now, as it sh
33c20 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73  ould not be poss
33c30 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ible.        ** 
33c40 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73  to be in ERROR s
33c50 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20  tate when there 
33c60 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e  are zero outstan
33c70 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20  ding page .     
33c80 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
33c90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
33ca0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
33cb0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
33cc0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
33cd0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
33ce0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33cf0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33d00 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  OPEN );.      as
33d10 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
33d20 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
33d30 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  K).           ||
33d40 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
33d50 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
33d60 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  r->eLock>SHARED_
33d70 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20  LOCK).      );. 
33d80 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
33d90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
33da0 26 26 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 29 7b 0a  ldSharedLock ){.
33dc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
33dd0 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
33de0 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
33df0 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20  then check to.  
33e00 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68      ** see if th
33e10 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
33e20 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
33e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
33e40 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20  as changed,.    
33e50 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63    ** flush the c
33e60 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65  ache.  The hasHe
33e70 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61  ldSharedLock fla
33e80 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  g prevents this 
33e90 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63  from.      ** oc
33ea0 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76  curring on the v
33eb0 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73  ery first access
33ec0 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f   to a file, in o
33ed0 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20  rder to save a. 
33ee0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75       ** single u
33ef0 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74  nnecessary sqlit
33f00 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20  e3OsRead() call 
33f10 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e  at the start-up.
33f20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33f30 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
33f40 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ges are detected
33f50 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
33f60 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
33f70 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
33f80 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
33f90 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
33fa0 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
33fb0 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
33fc0 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
33fd0 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
33fe0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
33ff0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
34000 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
34010 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
34020 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
34030 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
34040 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
34050 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
34060 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
34070 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
34080 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
34090 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
340a0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
340b0 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
340c0 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
340d0 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
340e0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
340f0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
34100 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
34110 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
34120 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
34130 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
34140 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
34150 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34160 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
34170 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
34180 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
34190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
341a0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
341b0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
341c0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
341d0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
341e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
341f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
34200 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
34210 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
34220 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
34230 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
34240 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
34250 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
34260 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
34270 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
34280 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
34290 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
342a0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
342b0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
342c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
342d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
342e0 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  er);..        /*
342f0 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62   Unmap the datab
34300 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20  ase file. It is 
34310 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78  possible that ex
34320 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73  ternal processes
34330 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
34340 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74  have truncated t
34350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34360 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64   and then extend
34370 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20  ed it back.     
34380 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69     ** to its ori
34390 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65  ginal size while
343a0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61   this process wa
343b0 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20  s not holding a 
343c0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  lock..        **
343d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
343e0 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20  ere may exist a 
343f0 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69  Pager.pMap mappi
34400 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a  ng that appears.
34410 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
34420 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20   the right size 
34430 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61  but is not actua
34440 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64  lly valid. Avoid
34450 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
34460 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20   possibility by 
34470 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62  unmapping the db
34480 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
34490 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
344a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
344b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
344c0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
344d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
344e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
344f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
34500 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
34510 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
34520 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
34530 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
34540 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
34550 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
34560 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
34570 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
34580 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
34590 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
345a0 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
345b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
345c0 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
345d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
345e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
345f0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
34600 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
34610 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
34620 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34630 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
34640 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
34650 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
34660 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
34670 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
34680 65 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  e==0 && pPager->
34690 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
346a0 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
346b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
346c0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
346d0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
346e0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
346f0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
34700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34710 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
34720 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
34730 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
34740 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34750 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
34760 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
34770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
34780 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
34790 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ER;.    pPager->
347a0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
347b0 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  k = 1;.  }.  ret
347c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
347d0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
347e0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
347f0 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
34800 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
34810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
34820 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
34830 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
34840 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
34850 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
34860 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
34870 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
34880 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
34890 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
348a0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
348b0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
348c0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
348d0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
348e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
348f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
34900 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
34910 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
34920 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63  .  if( sqlite3Pc
34930 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
34940 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
34950 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
34960 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
34970 3d 3d 30 20 29 3b 20 2f 2a 20 62 65 63 61 75 73  ==0 ); /* becaus
34980 65 20 70 61 67 65 31 20 69 73 20 6e 65 76 65 72  e page1 is never
34990 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a   memory mapped *
349a0 2f 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  /.    pagerUnloc
349b0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
349c0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
349d0 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  ** The page gett
349e0 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68 20  er methods each 
349f0 74 72 79 20 74 6f 20 61 63 71 75 69 72 65 20 61  try to acquire a
34a00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a   reference to a.
34a10 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70 61 67  ** page with pag
34a20 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 49  e number pgno. I
34a30 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
34a40 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
34a50 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
34a60 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
34a70 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
34a80 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
34a90 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
34aa0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
34ab0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
34ac0 73 20 6f 66 20 74 68 65 20 67 65 74 74 65 72 20  s of the getter 
34ad0 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e 67  method depending
34ae0 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65  .** on the curre
34af0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
34b00 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pager..**.**    
34b10 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 29   getPageNormal()
34b20 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68 65           --  The
34b30 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a 2a   normal getter.*
34b40 2a 20 20 20 20 20 67 65 74 50 61 67 65 45 72 72  *     getPageErr
34b50 6f 72 28 29 20 20 20 20 20 20 20 20 20 20 2d 2d  or()          --
34b60 20 20 55 73 65 64 20 69 66 20 74 68 65 20 70 61    Used if the pa
34b70 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
34b80 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 20  or state.**     
34b90 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20 20  getPageMmap()   
34ba0 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64          --  Used
34bb0 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65   if memory-mappe
34bc0 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64  d I/O is enabled
34bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
34be0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
34bf0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
34c00 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
34c10 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
34c20 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
34c30 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
34c40 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
34c50 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
34c60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
34c70 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
34c80 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
34c90 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
34ca0 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
34cb0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
34cc0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
34cd0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
34ce0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
34cf0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
34d00 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
34d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
34d20 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
34d30 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
34d40 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
34d50 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
34d60 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
34d70 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
34d80 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
34d90 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
34da0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
34db0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
34dc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
34dd0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
34de0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
34df0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
34e00 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
34e10 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
34e20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
34e30 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
34e40 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
34e50 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
34e60 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20 74  page or if .** t
34e70 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
34e80 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  er contains the 
34e90 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
34ea0 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65 20  ENT bit and the 
34eb0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
34ec0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34ed0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
34ee0 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
34ef0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
34f00 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
34f10 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
34f20 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
34f30 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
34f40 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
34f50 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
34f60 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
34f70 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69 74  TENT is true, it
34f80 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
34f90 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
34fa0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
34fb0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
34fc0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
34fd0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
34fe0 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
34ff0 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
35000 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
35010 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
35020 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
35030 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
35040 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
35050 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
35060 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
35070 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
35080 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
35090 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
350a0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
350b0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
350c0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
350d0 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  * If PAGER_GET_N
350e0 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65  OCONTENT is true
350f0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
35100 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
35110 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  ed instead.** of
35120 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
35130 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
35140 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
35150 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
35160 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
35170 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
35180 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
35190 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
351a0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
351b0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
351c0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
351d0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
351e0 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
351f0 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
35200 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
35210 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
35220 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
35230 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
35240 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
35250 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
35260 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
35270 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
35280 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
35290 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
352a0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
352b0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
352c0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
352d0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
352e0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
352f0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
35300 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
35310 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
35320 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
35330 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
35340 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
35350 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
35360 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
35370 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
35380 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
35390 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
353a0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
353b0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
353c0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
353d0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
353e0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
353f0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
35400 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
35410 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
35420 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
35430 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
35440 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
35450 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
35460 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
35470 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
35480 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
35490 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
354a0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
354b0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
354c0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
354d0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
354e0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
354f0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
35500 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
35510 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c  nt getPageNormal
35520 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
35530 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
35540 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
35550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35560 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
35570 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35580 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
35590 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
355a0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
355b0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
355c0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
355d0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
355e0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
355f0 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
35600 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
35620 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43 6f   *pPg;.  u8 noCo
35630 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  ntent;          
35640 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
35650 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   if PAGER_GET_NO
35660 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20 2a  CONTENT is set *
35670 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  /.  sqlite3_pcac
35680 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a  he_page *pBase;.
35690 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
356a0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
356b0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
356c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
356d0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
356e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
356f0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35700 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
35710 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73  ert( pPager->has
35720 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d  HeldSharedLock==
35730 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  1 );..#ifndef SQ
35740 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
35750 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69  RENT.  /* If thi
35760 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45  s is an CONCURRE
35770 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  NT transaction a
35780 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  nd the page bein
35790 67 20 72 65 61 64 20 77 61 73 0a 20 20 2a 2a 20  g read was.  ** 
357a0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
357b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
357c0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
357d0 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a 20 20  n was opened,.  
357e0 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73 20 72 65  ** mark it as re
357f0 61 64 20 69 6e 20 74 68 65 20 70 41 6c 6c 52 65  ad in the pAllRe
35800 61 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a 20  ad vector.  */. 
35810 20 70 50 67 20 3d 20 30 3b 0a 20 20 69 66 28 20   pPg = 0;.  if( 
35820 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
35830 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72   && pgno<=pPager
35840 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
35850 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
35860 22 55 53 49 4e 47 20 70 61 67 65 20 25 64 5c 6e  "USING page %d\n
35870 22 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72  ", pgno));.    r
35880 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
35890 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41 6c  cSet(pPager->pAl
358a0 6c 52 65 61 64 2c 20 70 67 6e 6f 29 3b 0a 20 20  lRead, pgno);.  
358b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
358c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
358d0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
358e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
358f0 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
35900 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35910 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d 20  BKPT;.  pBase = 
35920 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35930 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
35940 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
35950 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
35960 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
35970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
35980 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
35990 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
359a0 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
359b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
359c0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
359d0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
359e0 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
359f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35a00 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
35a10 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
35a20 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35a30 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d     }.  }.  pPg =
35a40 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
35a50 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
35a60 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
35a70 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
35a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
35a90 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20  ==(*ppPage) );. 
35aa0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
35ab0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
35ac0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
35ad0 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
35ae0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
35af0 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66    noContent = (f
35b00 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
35b10 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a  _NOCONTENT)!=0;.
35b20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
35b30 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
35b40 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
35b50 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
35b60 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
35b70 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
35b80 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
35b90 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
35ba0 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
35bb0 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
35bc0 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
35bd0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
35be0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
35bf0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
35c00 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
35c10 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
35c20 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
35c30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
35c40 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
35c50 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
35c60 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
35c70 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
35c80 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
35c90 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42  e initialized. B
35ca0 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65 72  ut first some er
35cb0 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20 20  ror checks:.    
35cc0 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54 68  **.    ** (1) Th
35cd0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
35ce0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20 20  umber is 2^31.  
35cf0 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20 74    ** (2) Never t
35d00 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ry to fetch the 
35d10 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20 20  locking page.   
35d20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
35d30 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
35d40 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
35d50 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
35d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
35d70 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35d80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
35d90 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35da0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
35db0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
35dc0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ..    assert( !i
35dd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
35de0 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ) || !MEMDB );. 
35df0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
35e00 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
35e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
35e20 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29  o || noContent )
35e30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
35e40 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
35e50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
35e60 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
35e70 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
35e80 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35e90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
35ea0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
35eb0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
35ec0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
35ed0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
35ee0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
35ef0 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
35f00 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
35f10 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
35f20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
35f30 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
35f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
35f50 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
35f60 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
35f70 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
35f80 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
35f90 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
35fa0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
35fb0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
35fc0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
35fd0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
35fe0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
35ff0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
36000 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
36010 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
36020 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
36030 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
36040 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
36050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
36060 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
36070 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
36080 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36090 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
360a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
360b0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
360c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
360d0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
360e0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
360f0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
36100 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
36110 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
36120 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
36130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
36140 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
36150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36160 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
36170 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
36180 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
36190 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
361a0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
361b0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
361c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
361d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
361e0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
361f0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
36200 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
36210 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
36220 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
36230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
36250 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
36260 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
36270 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
36280 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
36290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
362a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
362b0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
362c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
362d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
362e0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
362f0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
36300 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
36310 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
36320 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  er);.  *ppPage =
36330 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
36340 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
36350 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
36360 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
36370 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f 72  r for when memor
36380 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
36390 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
363a0 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61  c int getPageMMa
363b0 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
363c0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
363d0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
363e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
363f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
36400 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
36410 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
36420 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
36430 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
36440 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
36450 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
36460 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
36470 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
36480 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
36490 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
364a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
364b0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33  r *pPg = 0;.  u3
364c0 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
364d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
364e0 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
364f0 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
36500 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65  .  /* It is acce
36510 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20  ptable to use a 
36520 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29  read-only (mmap)
36530 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61   page for any pa
36540 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70  ge except.  ** p
36550 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69  age 1 if there i
36560 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
36570 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74  action open or t
36580 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f  he ACQUIRE_READO
36590 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61  NLY.  ** flag wa
365a0 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
365b0 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73  he caller. And s
365c0 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62  o long as the db
365d0 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20   is not a .  ** 
365e0 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
365f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
36600 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74    */.  const int
36610 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f   bMmapOk = (pgno
36620 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  >1.   && (pPager
36630 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36640 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73  READER || (flags
36650 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   & PAGER_GET_REA
36660 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20  DONLY)).  );..  
36670 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43 48  assert( USEFETCH
36680 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 64  (pPager) );.#ifd
36690 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
366a0 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70 50  DEC.  assert( pP
366b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  ager->xCodec==0 
366c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
366d0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74  Optimization not
366e0 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22  e:  Adding the "
366f0 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65  pgno<=1" term be
36700 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68  fore "pgno==0" h
36710 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20  ere.  ** allows 
36720 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
36730 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20  imizer to reuse 
36740 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
36750 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a  he "pgno>1".  **
36760 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65   test in the pre
36770 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c  vious statement,
36780 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69   and avoid testi
36790 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68  ng pgno==0 in th
367a0 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61  e.  ** common ca
367b0 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73  se where pgno is
367c0 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28   large. */.  if(
367d0 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f   pgno<=1 && pgno
367e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
367f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
36800 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
36810 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
36820 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
36830 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
36840 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36850 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
36860 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68  ssert( pPager->h
36870 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
36880 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
36890 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
368a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
368b0 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
368c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
368d0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
368e0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
368f0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
36900 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
36910 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36930 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
36940 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
36960 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d  bMmapOk && iFram
36970 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69 64  e==0 ){.    void
36980 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20   *pData = 0;.   
36990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
369a0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
369b0 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29 28   .        (i64)(
369c0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
369d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
369e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
369f0 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20 20  Data.    );.    
36a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36a10 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20  K && pData ){.  
36a20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
36a30 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
36a40 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  DER || pPager->t
36a50 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
36a60 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
36a70 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
36a80 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
36a90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
36aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
36ab0 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
36ac0 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
36ad0 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
36ae0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
36af0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36b00 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
36b10 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
36b20 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
36b30 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
36b40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36b50 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPg ){.        a
36b60 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
36b70 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
36b80 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
36b90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36ba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
36bb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
36bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36bd0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36be0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
36bf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
36c00 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f  return getPageNo
36c10 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e  rmal(pPager, pgn
36c20 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
36c30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
36c40 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
36c50 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65  IZE>0 */../* The
36c60 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
36c70 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65  hod for when the
36c80 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72 72   pager is an err
36c90 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74  or state */.stat
36ca0 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72  ic int getPageEr
36cb0 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ror(.  Pager *pP
36cc0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
36cd0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
36ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36cf0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36d00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
36d10 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
36d20 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
36d30 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
36d40 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
36d50 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
36d60 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
36d70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
36d80 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
36d90 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
36da0 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a  ARAMETER(pgno);.
36db0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36dc0 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73  ER(flags);.  ass
36dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
36de0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
36df0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
36e00 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
36e10 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a  r->errCode;.}...
36e20 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20  /* Dispatch all 
36e30 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75 65  page fetch reque
36e40 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f  sts to the appro
36e50 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d 65  priate getter me
36e60 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  thod..*/.int sql
36e70 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
36e80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
36e90 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
36ea0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
36eb0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
36ec0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
36ed0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36ee0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
36ef0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
36f00 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
36f10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
36f20 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
36f30 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
36f40 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
36f50 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
36f60 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36f70 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  xGet(pPager, pgn
36f80 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
36f90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
36fa0 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
36fb0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
36fc0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
36fd0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
36fe0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
36ff0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
37000 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37010 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
37020 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
37030 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
37040 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
37050 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
37060 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
37070 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
37080 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
37090 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
370a0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
370b0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
370c0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
370d0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
370e0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
370f0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
37100 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
37110 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
37120 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
37130 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
37140 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
37150 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
37160 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
37170 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
37180 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
37190 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
371a0 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
371b0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
371c0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
371d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
371e0 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
371f0 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
37200 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
37210 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
37220 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
37230 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
37240 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d    assert( pPage=
37250 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61  =0 || pPager->ha
37260 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
37270 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  );.  if( pPage==
37280 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
37290 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
372a0 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
372b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
372c0 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d   pgno, pPage);.}
372d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
372e0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
372f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
37300 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
37310 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
37320 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29 20 6d  UnrefNotNull() m
37330 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73  ay only be.** us
37340 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20 74 68  ed if we know th
37350 61 74 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  at the page bein
37360 67 20 72 65 6c 65 61 73 65 64 20 69 73 20 6e 6f  g released is no
37370 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 2e  t the last page.
37380 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20 6c 61  .** The btree la
37390 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c 64 73  yer always holds
373a0 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e 74 69   page1 open unti
373b0 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20 74 68  l the end, so th
373c0 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 20  ese first.** to 
373d0 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62 65 20  routines can be 
373e0 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  used to release 
373f0 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72 20 74  any page other t
37400 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70 50 61  han BtShared.pPa
37410 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73  ge1..**.** Use s
37420 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
37430 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72 65 6c  PageOne() to rel
37440 65 61 73 65 20 70 61 67 65 31 2e 20 20 54 68 69  ease page1.  Thi
37450 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69 6e 65  s latter routine
37460 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65 20 74  .** checks the t
37470 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
37480 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
37490 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75 6d 62   and if the numb
374a0 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 72  er of.** pages r
374b0 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74 20 64  eaches zero it d
374c0 72 6f 70 73 20 74 68 65 20 64 61 74 61 62 61 73  rops the databas
374d0 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  e lock..*/.void 
374e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
374f0 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
37500 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f 4e 4c  *pPg){.  TESTONL
37510 59 28 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  Y( Pager *pPager
37520 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
37530 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ).  assert( pPg!
37540 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  =0 );.  if( pPg-
37550 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
37560 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73 65 72  MAP ){.    asser
37570 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 31 20  t( pPg->pgno!=1 
37580 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69 73 20  );  /* Page1 is 
37590 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70  never memory map
375a0 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ped */.    pager
375b0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
375c0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
375d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
375e0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
375f0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65  .  /* Do not use
37600 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
37610 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 61 73   release the las
37620 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  t reference to p
37630 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  age1 */.  assert
37640 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
37650 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
37660 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 7d 0a  pPCache)>0 );.}.
37670 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
37680 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
37690 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
376a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
376b0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
376c0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
376d0 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
376e0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
376f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
37700 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
37710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
37720 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 61  ->pgno==1 );.  a
37730 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
37740 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 29  gs & PGHDR_MMAP)
37750 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65 31 20  ==0 ); /* Page1 
37760 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
37770 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50 61 67  mapped */.  pPag
37780 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
37790 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
377a0 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74  ResetLockTimeout
377b0 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  (pPager);.  sqli
377c0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
377d0 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e  (pPg);.  pagerUn
377e0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
377f0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ger);.}../*.** T
37800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37810 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
37820 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
37830 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
37840 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
37850 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
37860 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
37870 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
37880 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
37890 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
378a0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
378b0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
378c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
378d0 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
378e0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
378f0 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
37900 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
37910 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
37920 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
37930 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
37940 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
37950 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
37960 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
37970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
37980 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
37990 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
379a0 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
379b0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
379c0 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
379d0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
379e0 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
379f0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
37a00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
37a10 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
37a20 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
37a30 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
37a40 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
37a50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
37a60 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
37a70 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
37a80 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
37a90 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
37aa0 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
37ab0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
37ac0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37ad0 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
37ae0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
37af0 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
37b00 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
37b10 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
37b20 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
37b30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
37b40 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
37b50 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
37b60 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
37b70 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
37b80 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
37b90 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
37ba0 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
37bb0 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
37bc0 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
37bd0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
37be0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
37bf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37c00 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
37c10 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
37c20 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
37c30 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
37c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
37c60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
37c70 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
37c80 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
37c90 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
37ca0 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
37cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
37cc0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37cd0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
37cf0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37d00 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
37d10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37d20 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
37d30 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
37d40 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
37d50 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
37d60 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
37d70 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
37d80 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
37d90 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
37da0 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
37db0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
37dc0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
37dd0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
37de0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
37df0 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
37e00 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
37e10 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
37e20 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
37e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
37e40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37e50 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
37e60 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37e70 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
37e80 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
37e90 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
37ea0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37eb0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
37ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37ed0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
37ee0 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
37ef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
37f00 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
37f10 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
37f20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
37f30 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
37f40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
37f50 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
37f60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
37f70 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
37f80 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
37f90 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
37fa0 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
37fb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
37fc0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
37fd0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
37fe0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
37ff0 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c         int nSpil
38000 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  l;..        if( 
38010 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
38020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
38030 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
38040 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
38050 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
38060 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
38070 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
38080 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
38090 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20  tmtSpill;.      
380a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
380b0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
380c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
380d0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
380e0 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66  nSpill = jrnlBuf
380f0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ferSize(pPager);
38100 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38110 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a       .        /*
38120 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
38130 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
38140 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
38150 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
38160 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
38170 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
38180 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
38190 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
381a0 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
381b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
381c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
381d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
381e0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20  ite3JournalOpen 
381f0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
38200 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
38210 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
38220 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69  jfd, flags, nSpi
38230 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  ll.          );.
38240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38250 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
38260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
38270 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
38280 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
38290 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
382a0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
382b0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
382c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
382d0 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
382e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
382f0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
38300 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
38310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38320 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
38330 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
38340 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
38350 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
38360 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
38370 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
38380 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
38390 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
383a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
383b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
383c0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
383d0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
383e0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
383f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
38400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
38410 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
38420 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
38430 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
38440 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
38450 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
38460 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
38470 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38480 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
38490 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
384a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
384b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
384c0 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
384d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
384e0 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
384f0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
38500 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
38510 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
38520 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
38530 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
38540 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
38550 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
38560 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
38570 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
38580 74 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71  t is 0, then acq
38590 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
385a0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
385b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
385c0 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
385d0 20 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71   is >0, then acq
385e0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
385f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
38600 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
38610 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
38620 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
38630 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
38640 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
38650 2a 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29  ** If (exFlag<0)
38660 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
38670 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  e is in WAL mode
38680 2c 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e  , do not take an
38690 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20  y locks..** The 
386a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
386b0 20 72 75 6e 20 69 6e 20 43 4f 4e 43 55 52 52 45   run in CONCURRE
386c0 4e 54 20 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e  NT mode instead.
386d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
386e0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
386f0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
38700 20 74 68 65 6e 20 61