/ Hex Artifact Content
Login

Artifact ff40d2a98f135c8505b1a0a0b17bbe5f2a3c0cd5:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e 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 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
71b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
71c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
71d0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
71e0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
71f0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
7200: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
7210: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
7220: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
7230: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7250: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7260: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7270: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7290: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
72a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
72b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7310: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7320: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7330: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7340: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7350: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
7360: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
7370: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
7380: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7390: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
73a0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
73b0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
73c0: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
73d0: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
73e0: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
73f0: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7400: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7410: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7420: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7440: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7450: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
7460: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
7470: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
7480: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7490: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
74a0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
74b0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
74c0: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
74d0: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
74e0: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
74f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7500: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7510: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7520: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7530: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7550: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
7560: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
7570: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
7580: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7590: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
75a0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
75b0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
75c0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
75f0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7600: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7610: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7620: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7630: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7640: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7650: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7660: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20  doNotSyncSpill; 
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
7680: 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68  ot do a spill th
7690: 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c  at requires jrnl
76a0: 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75   sync */.  u8 su
76b0: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
76c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
76d0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
76e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
76f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7710: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7720: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7730: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7740: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7750: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7760: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7780: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
77a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
77b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
77c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
77d0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
77e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
77f0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7800: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7810: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7830: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7840: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7880: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7890: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
78a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
78b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
78c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
78d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
78e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
78f0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7920: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7930: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7940: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7950: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7960: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7970: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
79a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
79b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
79c0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
79d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79e0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
79f0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a00: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7a10: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7a20: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7a30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a40: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7a50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7a60: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7a70: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7a80: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7a90: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7aa0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7ab0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7ac0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7ad0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7b00: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7b10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7b20: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7b30: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7b40: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7b50: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7b60: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7b70: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7b80: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7bb0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7bc0: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7bd0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7be0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7bf0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7c00: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7c10: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7c20: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7c30: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7c40: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
7ca0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7cc0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
7cd0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
7ce0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
7cf0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
7d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d10: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
7d20: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7d30: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7d40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7d50: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7d60: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7d70: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
7d80: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
7d90: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
7da0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
7db0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
7dc0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7de0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7df0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
7e00: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7e20: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
7e30: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
7e40: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
7e50: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
7e70: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
7e80: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
7e90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
7ea0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
7eb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ed0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
7ee0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
7ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
7f00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f10: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
7f20: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
7f30: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
7f40: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
7f50: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
7f60: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
7f70: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
7f80: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
7f90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7fa0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
7fb0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
7fc0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
7fd0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
7fe0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
7ff0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
8000: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
8010: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
8020: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8030: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8040: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8050: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8060: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8070: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8080: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8090: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
80a0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
80b0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
80c0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
80d0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
80e0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
80f0: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8100: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8110: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8120: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8130: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8150: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8160: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8170: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
81a0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
81b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
81c0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
81d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
81e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
81f0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8200: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8210: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8220: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8230: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8240: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8260: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8280: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8290: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
82a0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
82b0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
82e0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
82f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8300: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8310: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8320: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8330: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8340: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8350: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8360: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8370: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8380: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8390: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
83a0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
83b0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
83c0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
83d0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
83e0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
83f0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8400: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8410: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8420: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8430: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8460: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8470: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8490: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
84a0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
84b0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
84c0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
84d0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
84e0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
84f0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8500: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8510: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8520: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8530: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8540: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8550: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8560: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8570: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8580: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8590: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
85a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
85b0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
85c0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
85d0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
85e0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
85f0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8610: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8620: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8630: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8640: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8650: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8660: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8670: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8680: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8690: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
86b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
86c0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
86d0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
86e0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
86f0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8700: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8710: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8720: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8730: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8740: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8750: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8760: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8770: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8780: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8790: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
87a0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
87b0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
87c0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
87d0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
87e0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
87f0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8800: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8810: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8820: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8830: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8840: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8850: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8860: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8870: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8880: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8890: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
88a0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
88b0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
88c0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
88d0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
88e0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
88f0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8900: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8910: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8920: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
8930: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
8940: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
8950: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8960: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8970: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8980: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8990: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
89a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
89b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
89c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
89d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
89e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
89f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8a00: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8a10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8a20: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8a30: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8a40: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8a50: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8a60: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8a70: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8a80: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8a90: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8aa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8ab0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8ac0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8ae0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8af0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8b00: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8b10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8b20: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8b30: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8b40: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8b50: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8b60: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8b70: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8b80: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8b90: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8ba0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8bb0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8bc0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8bd0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8be0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8bf0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8c00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8c10: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8c20: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8c30: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8c40: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8c50: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8c60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8c70: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8c80: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8c90: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8ca0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8cb0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8cc0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8ce0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8cf0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8d00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8d10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8d20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8d30: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8d40: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8d50: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8d60: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8d70: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8d80: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8d90: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8da0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8db0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8dc0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8dd0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8de0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8df0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8e00: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8e10: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8e20: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8e30: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8e40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8e50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8e60: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8e70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8e80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8e90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8ea0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8eb0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8ec0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8ed0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8ee0: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8ef0: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8f00: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8f10: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8f20: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8f30: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8f40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8f50: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
8f60: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
8f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8f80: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
8f90: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
8fa0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
8fb0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
8fc0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
8fd0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
8fe0: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
8ff0: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
9000: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9010: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
9020: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
9030: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
9040: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
9050: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9060: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9070: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9080: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9090: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
90a0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
90b0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
90c0: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
90d0: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
90e0: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
90f0: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
9100: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
9110: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
9120: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
9130: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
9140: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
9150: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9160: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9170: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9180: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9190: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
91a0: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
91b0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
91c0: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
91d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
91e0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
91f0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9200: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9210: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9240: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9260: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9270: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9280: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9290: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
92a0: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
92b0: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
92c0: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
92d0: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
92e0: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
92f0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9300: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9310: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9320: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
9330: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
9340: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
9350: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9360: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9370: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9380: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9390: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
93a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
93b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
93c0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
93d0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
93e0: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
93f0: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9400: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9410: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9420: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
9430: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
9440: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
9450: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9460: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9470: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9490: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
94a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
94b0: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
94c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
94d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
94e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
94f0: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9500: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9510: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9520: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
9530: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
9540: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
9550: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9560: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9570: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9580: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9590: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
95a0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
95b0: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
95c0: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
95d0: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
95e0: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
95f0: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9600: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9620: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
9630: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
9640: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9650: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9670: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9680: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9690: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
96a0: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
96b0: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
96c0: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
96d0: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
96e0: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
96f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9700: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9710: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9720: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9730: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9740: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9750: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9760: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9770: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9780: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9790: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
97a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
97b0: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
97c0: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
97d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
97e0: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
97f0: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9800: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9810: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9820: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9830: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9850: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9860: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9870: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9890: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
98a0: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
98b0: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
98c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
98d0: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
98e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
98f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9900: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9910: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9920: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9930: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9940: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9950: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9960: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9970: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9980: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
99a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
99b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
99c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
99d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
99f0: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9a00: 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64  OCK || p->noRead
9a10: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72  lock );.      br
9a20: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9a30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9a40: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
9a50: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9a60: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9a70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9a80: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9a90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9aa0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ab0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ad0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9ae0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b00: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
9b10: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
9b20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b30: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b40: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
9b50: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
9b60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9b70: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9b80: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
9b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ba0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9bb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9bc0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9bd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9be0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
9bf0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9c00: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9c10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c20: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9c30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9c40: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9c50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9c60: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
9c70: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
9c80: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
9c90: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
9ca0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
9cb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
9cc0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
9cd0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
9ce0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
9cf0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
9d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9d10: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
9d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
9d30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
9d40: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
9d50: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9d70: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d80: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
9d90: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9da0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9db0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9dc0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9dd0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9de0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9df0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e10: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9e40: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9e50: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9e60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e70: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9e80: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9e90: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
9ea0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9eb0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9ec0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9ed0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9ee0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f00: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f10: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f20: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
9f30: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
9f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9f50: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
9f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
9f70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9f80: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9f90: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9fa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9fb0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9fc0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9fd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9fe0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
9ff0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a000: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a010: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a020: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a040: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a050: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a070: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a080: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a090: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a0d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a0e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a0f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a100: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a110: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a120: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a130: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a140: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a150: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a160: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a170: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a180: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a190: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a1a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a1b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a1c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a1d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a1e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a1f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a200: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a210: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a220: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a230: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a250: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a260: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a270: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a280: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a290: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a2a0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a2b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a2c0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a2d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a2e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a2f0: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a300: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a310: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a320: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a330: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a340: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a350: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a360: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a370: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a380: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a390: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a3a0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a3b0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a3c0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a3d0: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a3e0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a3f0: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
a400: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
a410: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
a420: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
a430: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
a440: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
a450: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
a460: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
a470: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
a480: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
a490: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
a4a0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
a4b0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
a4c0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
a4d0: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
a4e0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a4f0: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
a500: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
a510: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
a520: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
a530: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
a540: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
a550: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
a560: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
a570: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
a580: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
a590: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
a5a0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
a5b0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
a5c0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
a5d0: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
a5e0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
a5f0: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
a600: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
a610: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a620: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
a630: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
a640: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
a650: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a660: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
a670: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
a680: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a690: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a6a0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
a6b0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
a6c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a6d0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a6e0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
a6f0: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
a700: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a710: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a720: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
a730: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
a740: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a750: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
a760: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
a770: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
a780: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
a790: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
a7a0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
a7b0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
a7c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a7d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
a7e0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
a7f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a800: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a810: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
a820: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
a830: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
a840: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
a850: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a860: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
a870: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
a880: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
a890: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
a8a0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
a8b0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
a8c0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
a8d0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a8e0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a8f0: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
a900: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
a910: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a920: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
a930: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
a940: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a950: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a960: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
a970: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
a980: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a990: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a9a0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
a9b0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
a9c0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9d0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9e0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
a9f0: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
aa00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aa10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
aa30: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
aa40: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
aa50: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
aa60: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
aa70: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
aa80: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
aa90: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
aaa0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
aab0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
aac0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
aad0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
aae0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
aaf0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
ab00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ab10: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ab20: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ab30: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ab40: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ab50: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ab60: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
ab70: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
ab80: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
ab90: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
aba0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
abb0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
abc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
abd0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
abe0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
abf0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
ac00: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
ac10: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
ac20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ac30: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
ac40: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
ac50: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
ac60: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
ac70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ac80: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
ac90: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
aca0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
acb0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
acc0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
acd0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
ace0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
acf0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ad00: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
ad10: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
ad20: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ad30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
ad40: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
ad50: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
ad60: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
ad70: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
ad80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ad90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ada0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
adb0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
adc0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
add0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ade0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
adf0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
ae00: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ae10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
ae20: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
ae30: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
ae40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
ae50: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
ae60: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
ae70: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
ae80: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
ae90: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
aea0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
aeb0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
aec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
aed0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
aee0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
aef0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
af00: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
af10: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
af20: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
af30: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
af40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af50: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
af60: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
af70: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
af80: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
af90: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
afa0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
afb0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
afc0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
afd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
afe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
aff0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b000: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b020: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b030: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b040: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b050: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b060: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b070: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b080: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b090: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b0a0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b0b0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b0c0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b0d0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b0f0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b100: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b120: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b130: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b140: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b150: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b160: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b170: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b180: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b190: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b1a0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b1b0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b1c0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b1d0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b1e0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b1f0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b200: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b210: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b220: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b230: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b240: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b250: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b260: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b270: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b280: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b290: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b2a0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b2b0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b2c0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b2d0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b2e0: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b2f0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b300: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b310: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b320: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b330: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b340: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b350: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b360: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b370: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b380: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b390: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b3a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b3b0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b3c0: 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
b3d0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b3e0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b3f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b400: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b410: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b420: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b430: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b440: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b460: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b480: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b490: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
b4a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b4b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
b4c0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b4d0: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
b4e0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
b4f0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
b500: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b510: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
b520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b530: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
b540: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b550: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b560: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
b570: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
b580: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
b590: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
b5a0: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
b5b0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
b5c0: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
b5d0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b5e0: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
b5f0: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
b600: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
b610: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
b620: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
b630: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b640: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
b650: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
b660: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
b670: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
b680: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
b690: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
b6a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b6b0: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
b6c0: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
b6d0: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
b6e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b6f0: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
b700: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b710: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b730: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b740: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
b750: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
b760: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
b780: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b790: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
b7a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
b7b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
b7c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b7d0: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
b7e0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
b7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b800: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
b810: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
b820: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b830: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
b840: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b850: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
b860: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
b870: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b880: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
b890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b8a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b8b0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
b8c0: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
b8d0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
b8e0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
b8f0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
b900: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
b910: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
b920: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
b930: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
b940: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
b950: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
b960: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
b970: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
b980: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
b990: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
b9a0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
b9b0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
b9c0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
b9d0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
b9e0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b9f0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
ba00: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
ba10: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
ba20: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
ba30: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
ba40: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
ba50: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
ba60: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
ba70: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
ba80: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
ba90: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
baa0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
bab0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
bac0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
bad0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
bae0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
baf0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
bb00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
bb10: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
bb20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bb30: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
bb40: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
bb50: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
bb60: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
bb70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
bb80: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
bb90: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
bba0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
bbb0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
bbc0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
bbd0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
bbe0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
bbf0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc10: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
bc20: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
bc30: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
bc60: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
bc70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bc90: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
bca0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
bcb0: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
bcc0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
bcd0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bce0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
bcf0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
bd00: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
bd10: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
bd20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
bd30: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
bd40: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
bd50: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
bd60: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bd70: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
bd80: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
bd90: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
bda0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
bdb0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
bdc0: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
bdd0: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
bde0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
bdf0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
be00: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
be10: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
be20: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
be30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
be40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
be50: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
be60: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
be70: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
be80: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
be90: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
bea0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
beb0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
bec0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
bed0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
bee0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
bef0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
bf00: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
bf10: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
bf20: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
bf30: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
bf40: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
bf50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bf60: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
bf70: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
bf80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
bf90: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
bfa0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
bfb0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
bfc0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
bfd0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
bfe0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
bff0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
c000: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
c010: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
c020: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
c030: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
c040: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
c050: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
c060: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
c070: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
c080: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
c090: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c0a0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
c0b0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
c0c0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
c0d0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
c0e0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
c0f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
c100: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
c110: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
c120: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
c130: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
c140: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
c150: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
c160: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
c170: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
c180: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
c190: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
c1a0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
c1b0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
c1c0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
c1d0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
c1e0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
c1f0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
c200: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
c210: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
c220: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
c230: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
c240: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
c250: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
c260: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
c270: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
c280: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
c290: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
c2a0: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
c2b0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
c2c0: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
c2d0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
c2e0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
c2f0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c300: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
c310: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
c320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c330: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
c340: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
c350: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c360: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
c370: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
c380: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
c390: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
c3a0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
c3b0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
c3c0: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
c3d0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
c3e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
c3f0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
c400: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
c410: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
c420: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
c430: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
c440: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c450: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
c460: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
c470: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
c480: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
c490: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
c4a0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
c4b0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
c4c0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
c4d0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
c4e0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
c4f0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
c500: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
c510: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
c520: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c530: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
c540: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c550: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
c560: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
c570: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
c580: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
c590: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
c5a0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
c5b0: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
c5c0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
c5d0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
c5e0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
c5f0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
c600: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c610: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
c620: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
c630: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
c640: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
c650: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
c660: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
c670: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
c680: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
c690: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
c6a0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
c6b0: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
c6c0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
c6e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
c6f0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
c700: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
c710: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
c720: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
c730: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
c740: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
c750: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c760: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c770: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
c780: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c790: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
c7a0: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
c7b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
c7c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
c7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
c7e0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
c7f0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
c800: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
c810: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
c820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c830: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c840: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
c850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
c860: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
c870: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c880: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
c890: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
c8a0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
c8b0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
c8c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
c8d0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
c8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c8f0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
c900: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
c910: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
c920: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
c940: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
c950: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
c960: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
c970: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
c980: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
c990: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
c9a0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
c9b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
c9c0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
c9d0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
c9e0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
c9f0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
ca00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ca10: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
ca20: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
ca30: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
ca40: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
ca50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
ca60: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
ca70: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
ca80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
caa0: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
cab0: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
cac0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
cad0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
cae0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
caf0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb00: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
cb10: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
cb20: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
cb30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
cb40: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
cb50: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
cb60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cb70: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
cb80: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
cb90: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
cba0: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
cbb0: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
cbc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
cbd0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
cbe0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
cbf0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
cc00: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
cc10: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
cc20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cc30: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
cc40: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
cc50: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
cc60: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
cc70: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
cc80: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
cc90: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
cca0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
ccb0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
ccc0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
ccd0: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
cce0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
ccf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
cd10: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
cd20: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
cd30: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
cd40: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
cd50: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
cd60: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
cd70: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
cd80: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
cd90: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
cda0: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
cdb0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
cdc0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
cdd0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
cde0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
cdf0: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
ce00: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
ce30: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
ce50: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
ce70: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
cec0: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
ced0: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
cee0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
cef0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
cf00: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
cf10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
cf20: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
cf30: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
cf40: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
cf50: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
cf60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
cf70: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
cf80: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
cf90: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
cfa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
cfb0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
cfc0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
cfd0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
cfe0: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
cff0: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
d000: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
d010: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
d020: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d030: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
d040: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d050: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
d060: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d070: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
d080: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
d090: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
d0a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
d0b0: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
d0c0: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
d0d0: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
d0e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
d0f0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
d100: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
d110: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
d120: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d140: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d150: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
d160: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
d170: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
d180: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
d190: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
d1a0: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
d1b0: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
d1c0: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
d1d0: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
d1e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d1f0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
d200: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
d210: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
d220: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
d230: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
d240: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
d250: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
d260: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
d270: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
d280: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
d290: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
d2a0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d2b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d2c0: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
d2d0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
d2e0: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
d2f0: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
d300: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
d310: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d320: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
d330: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
d340: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
d350: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
d360: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
d370: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
d380: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
d390: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d3a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d3b0: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
d3c0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
d3d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
d3e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
d3f0: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
d400: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
d410: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
d420: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d460: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
d470: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
d480: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
d490: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
d4a0: 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69     const i64 iLi
d4b0: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
d4c0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
d4d0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d4e0: 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20  e of jsl */..   
d4f0: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
d500: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
d510: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
d520: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
d530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
d540: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
d550: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
d560: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
d570: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
d580: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
d590: 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20  28] = {0};.     
d5a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
d5b0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
d5c0: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
d5d0: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
d5e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
d600: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d610: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d620: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
d630: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
d640: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
d650: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
d660: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d670: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
d680: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d690: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
d6a0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
d6b0: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
d6c0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
d6d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
d6e0: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
d6f0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
d700: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
d710: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
d720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
d730: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
d740: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
d750: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
d760: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
d770: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
d780: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
d790: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
d7a0: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
d7b0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
d7c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d7d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d7e0: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
d7f0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
d800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d810: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
d820: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
d830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d840: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
d850: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d860: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
d870: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d880: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
d890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d8a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d8b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d8c0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d8d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
d8e0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
d8f0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
d900: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
d910: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
d920: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
d930: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
d940: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
d950: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
d960: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
d970: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
d980: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
d990: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
d9a0: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
d9b0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
d9c0: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
d9d0: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
d9e0: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
d9f0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
da00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
da10: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
da20: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
da30: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
da40: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
da50: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
da60: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
da70: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
da80: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
da90: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
daa0: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
dab0: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
dac0: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
dad0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
dae0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
daf0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
db00: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
db10: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
db20: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
db30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
db40: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
db50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
db60: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
db70: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
db80: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
db90: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
dba0: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
dbb0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
dbc0: 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32  2 nHeader = (u32
dbd0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
dbe0: 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66  e;/* Size of buf
dbf0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
dc00: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
dc10: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
dc40: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
dc50: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
dc60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc80: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
dc90: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
dca0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
dcb0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
dcc0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
dcd0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
dce0: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
dcf0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
dd00: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
dd10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dd20: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
dd30: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
dd40: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
dd50: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
dd60: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
dd70: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
dd80: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
dd90: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
dda0: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
ddb0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
ddc0: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
ddd0: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
dde0: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
ddf0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
de00: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
de10: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
de20: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
de30: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
de40: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
de50: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
de60: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
de70: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
de80: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
de90: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
dea0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
deb0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
dec0: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
ded0: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
dee0: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
def0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
df00: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
df10: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
df20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
df30: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
df40: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
df50: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
df60: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
df70: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
df80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
df90: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
dfa0: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
dfb0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
dfc0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
dfd0: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
dfe0: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
dff0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
e000: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
e010: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
e020: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
e030: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
e040: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
e050: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
e060: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
e070: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
e080: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
e090: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
e0a0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
e0b0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
e0c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
e0d0: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
e0e0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
e0f0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
e100: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
e110: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
e120: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
e130: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
e140: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
e150: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
e160: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
e170: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
e180: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
e190: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
e1a0: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
e1b0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e1c0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
e1d0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
e1e0: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
e1f0: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
e200: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
e210: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
e220: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
e230: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
e240: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e250: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
e260: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
e270: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
e280: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
e290: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
e2a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
e2b0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e2c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
e2d0: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
e2e0: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50  Sync );.  if( pP
e2f0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
e300: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
e310: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e320: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
e330: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
e340: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
e350: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
e360: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
e370: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
e380: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
e390: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
e3a0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
e3b0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
e3c0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e3d0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e3e0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
e3f0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
e400: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
e410: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
e420: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
e430: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
e440: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
e450: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
e460: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
e470: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
e480: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e490: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
e4a0: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
e4b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e4c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e4d0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
e4e0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
e4f0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
e500: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
e510: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e520: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e530: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
e540: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
e550: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
e560: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
e570: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
e580: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e590: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e5a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
e5b0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
e5c0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
e5d0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
e5e0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e5f0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e600: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
e610: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
e620: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
e630: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
e640: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
e650: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
e660: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
e670: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
e680: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
e690: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
e6a0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
e6b0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
e6c0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
e6d0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
e6e0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
e6f0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
e700: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
e710: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
e720: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
e730: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e740: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
e750: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
e760: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e770: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
e780: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
e790: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
e7a0: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
e7b0: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
e7c0: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
e7d0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
e7e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e7f0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
e800: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
e810: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
e820: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
e830: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
e840: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
e850: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
e860: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
e870: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
e880: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
e890: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
e8a0: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
e8b0: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
e8c0: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
e8d0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
e8e0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
e8f0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
e900: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
e910: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
e920: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
e930: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
e940: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
e950: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
e960: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
e970: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
e980: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
e990: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
e9a0: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
e9b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e9c0: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
e9d0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
e9e0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
e9f0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
ea00: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
ea10: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
ea20: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
ea30: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
ea40: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
ea50: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
ea60: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
ea70: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
ea80: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
ea90: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
eaa0: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
eab0: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
eac0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ead0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
eae0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
eaf0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
eb00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
eb10: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
eb20: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
eb30: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
eb40: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
eb50: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
eb60: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
eb70: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
eb80: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
eb90: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
eba0: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
ebb0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
ebc0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
ebd0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
ebe0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
ebf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
ec00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ec10: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
ec20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ec30: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
ec40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
ec50: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
ec60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ec70: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
ec80: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
ec90: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
eca0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
ecb0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
ecc0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
ecd0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
ece0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
ecf0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
ed00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
ed10: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
ed20: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
ed30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
ed40: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
ed50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
ed60: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
ed70: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
ed80: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
ed90: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
eda0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
edb0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
edc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
edd0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
ede0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
edf0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
ee00: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
ee10: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
ee20: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
ee30: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
ee40: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
ee50: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
ee60: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
ee70: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
ee80: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
ee90: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
eea0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
eeb0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
eec0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
eed0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
eee0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
eef0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
ef00: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
ef10: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
ef20: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
ef30: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
ef40: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
ef50: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
ef60: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
ef70: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
ef80: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
ef90: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
efa0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
efb0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
efc0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
efd0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
efe0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
eff0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
f000: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
f010: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
f020: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
f030: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
f040: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
f050: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
f060: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
f070: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
f080: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0a0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
f0b0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
f0c0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
f0d0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
f0e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f0f0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
f100: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
f110: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
f120: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f130: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f140: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
f150: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
f160: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
f170: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
f180: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
f190: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
f1c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
f1d0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
f1e0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f1f0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
f200: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
f210: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
f220: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
f230: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
f240: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
f250: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
f260: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
f270: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
f280: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
f290: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
f2a0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
f2b0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
f2c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
f2d0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
f2e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
f2f0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
f300: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
f310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
f320: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
f330: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
f340: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
f350: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f360: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
f370: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f380: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
f390: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
f3a0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
f3b0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
f3c0: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
f3d0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
f3e0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
f3f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
f400: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
f410: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
f420: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
f430: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f440: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
f450: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
f460: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
f470: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
f480: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
f490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f4a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f4b0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
f4c0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
f4d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
f4e0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
f4f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
f500: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f510: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
f520: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
f530: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f540: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
f550: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f560: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
f570: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
f580: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
f590: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
f5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
f5b0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
f5c0: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
f5d0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
f5e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
f5f0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
f600: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
f610: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
f620: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
f630: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
f640: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
f650: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f660: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f670: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f680: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
f690: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f6a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f6b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f6c0: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
f6d0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
f6e0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f6f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f700: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f710: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
f720: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
f730: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
f740: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f750: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
f760: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
f770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f780: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
f790: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f7a0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
f7b0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
f7c0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
f7d0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
f7e0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  nal header */.. 
f7f0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
f800: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
f810: 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
f820: 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
f830: 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
f840: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
f850: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
f860: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
f870: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
f880: 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
f890: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f8a0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f8b0: 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
f8c0: 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
f8d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f8e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
f8f0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
f900: 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
f910: 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69   set the page-si
f920: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
f930: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68      ** journal h
f940: 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49  eader to zero. I
f950: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73  n this case, ass
f960: 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67  ume that the Pag
f970: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  er.pageSize.    
f980: 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ** variable is a
f990: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68  lready set to th
f9a0: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73  e correct page s
f9b0: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
f9c0: 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30  if( iPageSize==0
f9d0: 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53   ){.      iPageS
f9e0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
f9f0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  geSize;.    }.. 
fa00: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
fa10: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
fa20: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
fa30: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
fa40: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
fa50: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
fa60: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
fa70: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
fa80: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
fa90: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
faa0: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
fab0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
fac0: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
fad0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
fae0: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
faf0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
fb00: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
fb10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb20: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
fb50: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
fb60: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
fb70: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
fb80: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
fb90: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
fba0: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
fbb0: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
fbc0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
fbd0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
fbe0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
fbf0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
fc00: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
fc10: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
fc20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
fc30: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
fc40: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
fc50: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
fc60: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
fc70: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
fc80: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
fc90: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
fca0: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
fcb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
fcc0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
fcd0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
fce0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
fcf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
fd00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fd10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fd20: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
fd30: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
fd40: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
fd50: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
fd60: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
fd70: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
fd80: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
fd90: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
fda0: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
fdb0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
fdc0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
fdd0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
fde0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
fdf0: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
fe00: 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20  geSize, -1);.   
fe10: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
fe20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
fe30: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
fe40: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
fe50: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
fe60: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
fe70: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
fe80: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
fe90: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
fea0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
feb0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
fec0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
fed0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
fee0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
fef0: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
ff00: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
ff10: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
ff20: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
ff30: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
ff40: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
ff50: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
ff60: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ff70: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
ff80: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
ff90: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
ffa0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
ffb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ffc0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
ffd0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ffe0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
fff0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
10000 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
10010 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
10020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10030 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
10040 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
10050 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
10060 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10070 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
10080 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
10090 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
100a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
100b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
100c0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
100d0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
100e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
100f0 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
10100 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
10110 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
10120 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
10130 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
10140 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
10150 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
10160 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
10170 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10180 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
10190 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
101a0 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
101b0 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
101c0 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
101d0 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
101e0 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
101f0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10200 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
10210 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
10220 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
10230 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
10240 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
10250 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
10260 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
10270 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
10280 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
10290 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
102a0 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
102b0 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
102c0 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
102d0 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
102e0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
102f0 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
10300 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
10310 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
10320 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
10330 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
10340 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
10350 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
10360 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10370 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
10380 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
103b0 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
103e0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
103f0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
10400 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
10410 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10420 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
10430 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
10440 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
10470 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
10480 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
10490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
104a0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
104b0 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
104c0 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
104d0 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
104e0 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
104f0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
10500 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
10510 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
10520 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10530 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10540 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
10550 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  Y .   || pPager-
10560 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10570 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10580 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  OFF .  ){.    re
10590 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105a0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
105b0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
105c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
105d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
105e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
105f0 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
10600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10610 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
10620 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
10630 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
10640 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
10650 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
10660 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
10670 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
10680 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
10690 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
106a0 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
106b0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
106c0 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
106d0 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
106e0 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
106f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
10700 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10710 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
10720 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
10730 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
10740 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10750 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10760 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
10770 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
10780 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
10790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
107a0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
107b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
107c0 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
107d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
107e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
107f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
10800 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
10810 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10820 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
10830 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
10840 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
10850 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
10860 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
10870 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10880 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10890 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
108a0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
108b0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
108c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
108d0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
108e0 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
108f0 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
10900 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10910 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10920 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10930 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
10940 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10960 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10970 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10980 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
10990 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
109a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
109b0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
109c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
109d0 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
109e0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
109f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10a00 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10a10 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
10a20 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
10a30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10a40 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
10a50 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
10a60 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
10a70 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
10a80 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
10a90 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
10aa0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
10ab0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
10ac0 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
10ad0 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
10ae0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
10af0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
10b00 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
10b10 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
10b20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
10b30 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
10b40 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
10b50 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
10b60 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
10b70 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
10b80 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
10b90 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
10ba0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
10bb0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
10bc0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
10bd0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
10be0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
10bf0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
10c00 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
10c10 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
10c20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
10c30 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10c40 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
10c50 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
10c60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10c70 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
10c80 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
10c90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10ca0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10cb0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
10cc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
10cd0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
10ce0 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
10cf0 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
10d00 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
10d10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
10d20 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
10d30 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10d40 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
10d50 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
10d60 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
10d70 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
10d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
10d90 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
10da0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10dc0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
10dd0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
10de0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
10df0 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
10e00 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
10e10 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
10e20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
10e30 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
10e40 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
10e50 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
10e60 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
10e70 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
10e80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
10e90 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
10ea0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
10eb0 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
10ec0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10ed0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
10ee0 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
10ef0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
10f00 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
10f10 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
10f20 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
10f30 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
10f40 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
10f50 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
10f60 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
10f70 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
10f80 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
10f90 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
10fa0 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
10fb0 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
10fc0 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
10fd0 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
10fe0 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
10ff0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
11000 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
11010 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11020 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11030 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11040 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
11050 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
11060 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11080 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
11090 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
110a0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
110b0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
110c0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
110d0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
110e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
110f0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
11100 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
11110 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
11120 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
11130 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
11140 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
11150 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
11160 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11170 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11180 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11190 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
111a0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
111b0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
111c0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
111d0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
111e0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
111f0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
11200 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11210 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11220 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11230 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11240 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11250 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11260 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11270 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11280 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11290 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
112a0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
112b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
112c0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
112d0 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
112e0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
112f0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
11300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11310 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11330 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11340 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11350 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11360 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11370 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11380 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11390 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
113a0 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
113b0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
113c0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
113d0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
113e0 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
113f0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
11400 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11410 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11420 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11430 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11440 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11450 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11470 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11480 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11490 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
114a0 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
114b0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
114c0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
114d0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
114e0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
114f0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11510 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11520 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11530 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11540 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11550 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11560 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11570 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11580 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11590 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
115a0 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
115b0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
115c0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
115d0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
115e0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
115f0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11600 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11610 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11630 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11640 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11650 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11660 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11670 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11680 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11690 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
116a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
116b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
116c0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
116d0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
116e0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
116f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11700 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11710 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11720 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11730 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11740 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11750 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11760 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11770 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11780 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11790 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
117a0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
117b0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
117c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
117d0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
117e0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
117f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11800 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11810 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11820 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11830 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11840 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11850 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11860 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11870 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11880 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11890 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
118a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
118b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
118c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
118d0 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
118e0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
118f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11900 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11910 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11920 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11930 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11940 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11950 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11980 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11990 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
119a0 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
119b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
119c0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
119d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
119e0 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
119f0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11a00 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
11a10 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
11a20 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
11a30 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
11a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11a50 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
11a60 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
11a70 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
11a80 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
11a90 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
11aa0 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
11ab0 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
11ac0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
11ad0 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
11ae0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11af0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11b00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
11b10 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11b20 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11b30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
11b40 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11b50 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
11b70 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
11b80 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11b90 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
11ba0 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
11bb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11bd0 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
11be0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11bf0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c00 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
11c10 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
11c20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
11c30 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
11c40 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
11c50 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
11c60 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
11c70 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
11c80 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11c90 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
11ca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
11cb0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
11cc0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
11cd0 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
11ce0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11cf0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
11d00 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
11d10 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
11d20 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
11d30 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
11d40 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
11d50 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
11d60 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
11d70 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
11d80 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
11d90 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
11da0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
11db0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
11dc0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
11dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
11de0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
11df0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
11e00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
11e10 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
11e20 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
11e30 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
11e40 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
11e50 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
11e60 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
11e70 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
11e80 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
11e90 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
11ea0 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
11eb0 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
11ec0 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
11ed0 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
11ee0 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
11ef0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
11f00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11f10 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11f20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
11f30 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
11f40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
11f50 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
11f60 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
11f70 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
11f80 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
11f90 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
11fa0 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
11fb0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
11fc0 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
11fd0 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
11fe0 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
11ff0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
12000 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12010 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12020 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12030 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12040 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12050 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12060 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12070 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12080 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12090 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
120a0 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ode ){.    asser
120b0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
120c0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
120d0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
120e0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
120f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
12100 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72  File;.    pPager
12110 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12120 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65  _OPEN;.    pPage
12130 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
12140 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
12150 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12160 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
12170 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
12180 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
12190 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
121a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
121b0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
121c0 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
121d0 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
121e0 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
121f0 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
12200 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
12210 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
12220 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
12230 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
12240 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
12250 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
12260 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
12270 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
12280 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
12290 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
122a0 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
122b0 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
122c0 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
122d0 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
122e0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
122f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
12300 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
12310 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
12320 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
12330 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
12340 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
12350 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
12360 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
12370 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
12380 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
12390 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
123a0 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
123b0 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
123c0 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
123d0 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
123e0 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
123f0 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
12400 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
12410 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
12420 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
12430 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
12440 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
12450 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12460 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
12470 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
12480 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
12490 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
124a0 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
124b0 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
124c0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
124d0 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
124e0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
124f0 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
12500 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
12510 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
12520 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
12530 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
12540 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
12550 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
12560 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
12570 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
12580 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
12590 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
125a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
125b0 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
125c0 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
125d0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
125e0 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
125f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12600 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
12610 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
12620 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12630 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
12640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12650 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
12660 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
12670 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
12680 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
12690 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
126a0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
126b0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
126c0 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
126d0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
126e0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
126f0 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
12700 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12720 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12730 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12740 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12750 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12760 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12770 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12780 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12790 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
127a0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
127b0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
127c0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
127d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
127e0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
127f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12800 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12810 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12820 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12830 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12840 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12850 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12860 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12870 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12880 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12890 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
128a0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
128b0 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
128c0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
128d0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
128e0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
128f0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12900 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12910 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12920 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12930 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12940 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12950 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12960 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12970 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12980 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12990 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
129a0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
129b0 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
129c0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
129d0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
129e0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
129f0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12a00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12a10 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12a20 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12a30 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12a40 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12a50 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12a60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12a70 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12a80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12a90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12aa0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12ab0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ac0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12ad0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ae0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12af0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12b00 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12b10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12b20 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12b30 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12b40 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12b50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12b60 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12b70 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12b80 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12b90 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12ba0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12bb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12bc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12bd0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12be0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12bf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12c00 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12c10 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
12c20 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
12c30 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
12c40 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
12c50 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
12c60 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
12c70 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
12c80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
12c90 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
12ca0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
12cb0 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
12cc0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
12cd0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
12ce0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
12cf0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
12d00 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
12d10 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
12d20 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
12d30 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
12d40 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
12d50 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
12d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12d70 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
12d80 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
12d90 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
12da0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
12db0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12dc0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
12dd0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
12de0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
12df0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
12e00 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
12e10 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
12e20 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
12e30 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
12e40 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
12e50 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
12e60 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
12e70 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
12e80 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
12e90 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
12ea0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
12eb0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
12ec0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12ed0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12ee0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
12ef0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
12f00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12f10 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
12f20 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
12f30 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
12f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
12f50 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
12f60 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
12f70 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
12f80 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
12f90 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
12fa0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
12fb0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
12fc0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
12fd0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
12fe0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
12ff0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13000 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13010 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13020 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13030 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13040 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13050 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13060 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13070 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13080 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13090 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
130a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
130b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
130c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
130d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
130e0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
130f0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
13100 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
13110 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
13120 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13130 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
13140 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
13150 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
13160 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
13170 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13180 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13190 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
131a0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
131b0 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
131c0 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
131d0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
131e0 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
131f0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
13200 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
13210 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
13220 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
13230 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
13240 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
13250 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
13260 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
13270 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
13280 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13290 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
132a0 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
132b0 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
132c0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
132d0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
132e0 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
132f0 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13300 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13310 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13320 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
13330 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
13340 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13350 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
13360 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
13370 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
13380 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13390 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
133a0 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
133b0 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
133c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
133d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
133e0 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
133f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13400 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13410 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13420 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
13430 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
13440 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
13450 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
13460 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
13470 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
13480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13490 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
134a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
134b0 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
134c0 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
134d0 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
134e0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
134f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13500 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13510 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13520 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13530 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13540 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13550 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13560 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13570 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13580 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13590 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
135a0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
135b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
135c0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
135d0 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
135e0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
135f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13600 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13610 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13620 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
13630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13640 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13650 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
13660 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13670 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13680 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13690 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
136a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
136b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
136c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
136d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
136e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
136f0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
13700 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
13710 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
13720 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13730 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
13740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13750 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13760 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
13770 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
13780 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13790 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
137a0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
137b0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
137c0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
137d0 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
137e0 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
137f0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
13800 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13820 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
13830 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
13840 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
13850 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
13860 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
13870 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
13880 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
13890 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
138a0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
138b0 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
138c0 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
138d0 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
138e0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
138f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
13900 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
13910 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
13920 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
13930 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20  journal. .      
13940 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13960 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13970 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a  NALMODE_DELETE .
13980 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
13990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
139a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
139b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
139c0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
139d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
139e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
139f0 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
13a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
13a10 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
13a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
13a30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13a40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13a50 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13a60 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
13a70 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
13a80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13a90 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
13aa0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
13ab0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
13ac0 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
13ad0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
13ae0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
13af0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13b00 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
13b10 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
13b20 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
13b30 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
13b40 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f  dr *p = pager_lo
13b50 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
13b60 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
13b70 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
13b80 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
13b90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b  e3PagerUnref(p);
13ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13bb0 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
13bc0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
13bd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
13be0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
13bf0 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
13c00 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
13c10 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
13c20 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
13c30 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
13c40 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
13c50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
13c60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
13c70 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
13c80 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
13c90 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
13ca0 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
13cb0 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
13cc0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
13cd0 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
13ce0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
13cf0 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
13d00 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
13d10 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
13d20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
13d30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13d40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
13d50 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
13d60 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
13d70 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
13d80 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
13d90 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
13da0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
13db0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13dc0 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
13dd0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13de0 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
13df0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
13e00 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
13e10 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
13e20 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
13e30 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
13e40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
13e50 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
13e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
13e70 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
13e80 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
13e90 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
13ea0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
13eb0 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
13ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
13ed0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
13ee0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13ef0 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
13f00 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
13f10 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
13f20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
13f30 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
13f40 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
13f50 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
13f60 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
13f70 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
13f80 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
13f90 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
13fa0 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
13fb0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
13fc0 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
13fd0 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
13fe0 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
13ff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14000 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14010 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14020 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14030 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14040 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14050 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14060 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14070 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14080 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14090 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
140a0 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
140b0 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
140c0 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
140d0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
140e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
140f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14100 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14110 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14120 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14130 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14140 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14150 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14160 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14170 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14180 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14190 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
141a0 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
141b0 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
141c0 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
141d0 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
141e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
141f0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14200 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14210 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14220 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14230 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14240 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14250 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14260 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14270 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14280 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14290 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
142a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
142b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
142c0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
142d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
142e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
142f0 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14300 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14310 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
14320 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14330 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
14340 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14350 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14360 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14370 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14380 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14390 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
143a0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
143b0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
143c0 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
143d0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
143e0 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
143f0 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14400 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14410 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14420 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14430 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14440 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14450 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14460 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14470 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14480 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14490 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
144a0 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
144b0 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
144c0 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
144d0 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
144e0 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
144f0 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14500 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14510 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14520 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14530 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14540 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14550 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14560 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14570 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14580 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14590 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
145a0 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
145b0 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
145c0 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
145d0 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
145e0 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
145f0 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14600 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14610 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14620 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14630 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14640 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14650 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14660 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14670 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14680 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14690 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
146a0 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
146b0 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
146c0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
146d0 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
146e0 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
146f0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14700 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14710 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14720 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14730 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14740 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14750 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14760 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14770 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14780 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14790 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
147a0 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
147b0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
147c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
147d0 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
147e0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
147f0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14800 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14810 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14820 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14830 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14840 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14850 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14860 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14870 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14880 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14890 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
148a0 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
148b0 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
148c0 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
148d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
148e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
148f0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14900 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14910 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14920 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14930 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14940 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14950 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14960 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
14990 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
149a0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
149b0 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
149c0 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
149d0 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
149e0 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
149f0 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
14a00 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
14a10 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
14a20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14a30 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
14a40 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
14a50 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
14a60 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
14a70 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
14a80 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
14a90 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
14aa0 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
14ab0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
14ac0 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
14ad0 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
14ae0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
14af0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
14b00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
14b10 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
14b20 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
14b30 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
14b40 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
14b50 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
14b60 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
14b70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
14b80 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
14b90 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
14ba0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14bb0 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
14bc0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
14bd0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
14be0 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
14bf0 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
14c00 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
14c10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14c20 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
14c30 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
14c40 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
14c50 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
14c60 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
14c70 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
14c80 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
14c90 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
14ca0 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
14cb0 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
14cc0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
14cd0 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
14ce0 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
14cf0 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
14d00 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
14d10 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
14d20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
14d30 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
14d40 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
14d50 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
14d60 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
14d70 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
14d80 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
14d90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
14da0 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
14db0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
14dc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
14dd0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
14de0 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
14df0 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
14e00 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14e10 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
14e20 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
14e30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14e40 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
14e50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14e60 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
14e70 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
14e80 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
14e90 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
14ea0 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
14eb0 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
14ec0 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
14ed0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
14ee0 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
14ef0 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
14f00 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
14f10 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
14f20 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
14f30 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
14f40 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
14f50 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
14f60 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
14f70 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
14f80 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14f90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
14fa0 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
14fb0 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
14fc0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
14fd0 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
14fe0 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
14ff0 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15000 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15010 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15020 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
15040 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
15050 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
15060 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
15070 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
15080 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
150a0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
150b0 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
150c0 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
150d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
150e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
150f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15100 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15110 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
15140 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
15150 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
15160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15170 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
15180 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15190 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
151a0 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
151b0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
151c0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
151d0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
151e0 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15200 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15210 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15220 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
15230 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
15240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15250 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
15260 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
15270 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
15280 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
152a0 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
152b0 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
152c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152e0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
152f0 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15300 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15310 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
15330 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
15340 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
15350 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
15380 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15390 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
153a0 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
153b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
153c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
153d0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
153e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
153f0 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15400 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15410 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15420 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15430 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15440 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15450 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15460 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15470 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15480 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15490 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
154a0 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
154b0 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
154c0 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
154d0 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
154e0 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
154f0 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15500 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15510 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15520 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15530 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15540 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15550 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15560 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15570 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15580 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15590 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
155a0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
155b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
155c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
155d0 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
155e0 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
155f0 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15600 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15610 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15620 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15630 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15640 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15650 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15660 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15670 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15680 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15690 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
156a0 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
156b0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
156c0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
156d0 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
156e0 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
156f0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15700 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15710 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15720 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15730 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15740 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15750 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15770 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15780 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15790 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
157a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
157b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
157c0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
157d0 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
157e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
157f0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15800 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15810 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15820 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15830 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15840 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15850 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15860 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15870 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15880 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15890 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
158a0 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
158b0 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
158c0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
158d0 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
158e0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
158f0 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15900 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15920 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15930 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15940 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15950 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15960 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15980 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
15990 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
159a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
159b0 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
159c0 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
159d0 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
159e0 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
159f0 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
15a00 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
15a10 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
15a20 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
15a30 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
15a40 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
15a50 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
15a60 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
15a70 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
15a80 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
15a90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
15aa0 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
15ab0 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
15ac0 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
15ad0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
15ae0 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
15af0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
15b00 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
15b10 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
15b20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
15b30 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
15b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15b50 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
15b60 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
15b70 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
15b80 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
15b90 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
15ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15bb0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
15bc0 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
15bd0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
15be0 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
15bf0 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
15c00 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15c10 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
15c20 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
15c30 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
15c40 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
15c50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15c60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
15c70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
15c80 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
15c90 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15ca0 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
15cb0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
15cc0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
15cd0 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
15ce0 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
15cf0 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
15d00 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
15d10 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
15d20 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
15d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15d40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15d50 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
15d60 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
15d70 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
15d80 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
15d90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15da0 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
15db0 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
15dc0 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
15dd0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
15de0 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
15df0 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
15e00 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
15e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15e20 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
15e30 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
15e40 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
15e50 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
15e60 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
15e70 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
15e80 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
15e90 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
15ea0 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
15eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15ec0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
15ed0 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
15ee0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
15ef0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
15f00 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
15f10 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
15f20 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
15f30 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
15f40 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
15f50 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
15f60 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
15f70 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
15f80 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
15f90 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
15fa0 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
15fb0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
15fc0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
15fd0 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
15fe0 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
15ff0 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16000 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16010 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16020 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
16030 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
16040 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
16050 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
16060 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
16070 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
16080 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16090 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
160a0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
160b0 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
160c0 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
160d0 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
160e0 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
160f0 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16100 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16110 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16120 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
16130 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
16140 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
16150 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16160 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
16170 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
16180 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16190 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
161a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
161b0 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
161c0 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
161d0 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
161e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
161f0 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16200 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16210 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16220 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
16230 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
16240 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
16250 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
16260 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
16270 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
16280 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16290 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
162a0 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
162b0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
162c0 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
162d0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
162e0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
162f0 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16300 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16310 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16320 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
16330 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
16340 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
16350 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
16360 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
16370 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
16380 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16390 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
163a0 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
163b0 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
163c0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
163d0 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
163e0 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
163f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16400 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16410 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16420 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16430 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16440 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16450 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16460 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16480 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16490 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
164a0 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
164b0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
164c0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
164d0 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
164e0 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
164f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16500 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16510 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16520 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16530 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16540 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16550 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16560 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16570 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16580 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
165a0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
165b0 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
165c0 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
165d0 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
165e0 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
165f0 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16600 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16610 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16620 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16630 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16640 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16650 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16660 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16670 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16680 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16690 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
166a0 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
166b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
166c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
166d0 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
166e0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
166f0 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16700 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16710 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16720 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16730 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16740 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16750 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16760 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16770 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16780 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16790 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
167a0 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
167b0 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
167c0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
167d0 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
167e0 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
167f0 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16800 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16810 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16820 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16830 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16840 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16850 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16860 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16870 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16880 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16890 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
168a0 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
168b0 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
168c0 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
168d0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
168e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
168f0 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16900 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16910 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16920 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16930 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16940 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16950 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16970 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29  Pager->fd, (u8*)
16980 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16990 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
169a0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
169b0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
169c0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
169d0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
169e0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  no;.    }.    if
169f0 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
16a00 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  p ){.      CODEC
16a10 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
16a20 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
16a30 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
16a40 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
16a50 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
16a60 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
16a70 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
16a80 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
16a90 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
16aa0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
16ab0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
16ac0 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69  }else if( !isMai
16ad0 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20  nJrnl && pPg==0 
16ae0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
16af0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
16b00 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61  of a savepoint a
16b10 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20  nd data was not 
16b20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
16b30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
16b40 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
16b50 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68  ot in-memory, th
16b60 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69  ere is a potenti
16b70 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65  al.    ** proble
16b80 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  m. When the page
16b90 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64   is next fetched
16ba0 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
16bb0 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a  ayer, it .    **
16bc0 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
16bd0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
16be0 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20  file, which may 
16bf0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20  or may not be . 
16c00 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a     ** current. .
16c10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16c20 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
16c30 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61   of different wa
16c40 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ys this can happ
16c50 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74  en. All are quit
16c60 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65  e.    ** obscure
16c70 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  . When running i
16c80 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  n synchronous mo
16c90 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c  de, this can onl
16ca0 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a  y happen .    **
16cb0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
16cc0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
16cd0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16ce0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16cf0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f  , then.    ** po
16d00 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f  pulated, then mo
16d10 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
16d20 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
16d30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16d40 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
16d50 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d  to add an in-mem
16d60 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20  ory page to the 
16d70 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cache containing
16d80 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16d90 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
16da0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
16db0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
16dc0 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20  s dirty .    ** 
16dd0 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72  and if the pager
16de0 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72   requires a jour
16df0 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d  nal-sync, then m
16e00 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16e10 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e  .    ** requirin
16e20 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  g a journal-sync
16e30 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
16e40 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
16e50 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
16e60 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pnt );.    asser
16e70 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
16e80 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  Spill==0 );.    
16e90 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
16ea0 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll++;.    rc = s
16eb0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
16ec0 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
16ed0 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
16ee0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
16ef0 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a  oNotSpill==1 );.
16f00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
16f10 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66  tSpill--;.    if
16f20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16f40 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
16f50 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
16f60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
16f70 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
16f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
16f90 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
16fa0 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
16fb0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
16fc0 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
16fd0 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
16fe0 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
16ff0 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
17000 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
17010 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
17020 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
17030 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
17040 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
17050 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
17060 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
17070 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
17080 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
17090 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
170a0 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
170b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
170c0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
170d0 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
170e0 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
170f0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
17100 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
17110 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
17120 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17130 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
17140 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
17150 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  if( isMainJrnl &
17160 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c  & (!isSavepnt ||
17170 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65   *pOffset<=pPage
17180 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29  r->journalHdr) )
17190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
171a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
171b0 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73  is page were jus
171c0 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  t restored from 
171d0 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20  the main .      
171e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
171f0 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e   then its conten
17200 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65  t must be as the
17210 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20  y were when the 
17220 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
17230 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20  ction was first 
17240 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
17250 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b  case we can mark
17260 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
17270 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e  ** as clean, sin
17280 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ce there will be
17290 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74   no need to writ
172a0 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a  e it out to the.
172b0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
172c0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
172d0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
172e0 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
172f0 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
17300 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
17310 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
17320 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
17330 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
17340 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
17350 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
17360 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
17370 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
17380 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
17390 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
173a0 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
173b0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
173c0 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
173d0 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
173e0 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
173f0 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
17400 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
17410 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
17420 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
17430 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
17440 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
17450 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
17460 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
17470 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
17480 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17490 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
174a0 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
174b0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
174c0 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
174d0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
174e0 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
174f0 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
17500 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
17510 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
17520 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
17530 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
17540 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
17550 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
17560 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
17570 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17580 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
17590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
175a0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
175b0 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
175c0 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
175d0 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
175e0 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
175f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17600 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
17610 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
17620 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
17630 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
17640 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
17650 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
17660 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
17670 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
17680 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
17690 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
176a0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
176b0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
176c0 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
176d0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
176e0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
176f0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
17700 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
17710 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
17720 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
17730 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
17740 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17750 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
17760 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
17770 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
17780 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
17790 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
177a0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
177b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
177c0 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
177d0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
177e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
177f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
17800 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
17810 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
17820 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17830 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
17840 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
17850 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
17860 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
17870 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
17880 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17890 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
178a0 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
178b0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
178c0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
178d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
178e0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
178f0 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
17900 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
17910 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
17920 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
17930 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
17940 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
17950 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
17960 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
17970 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
17980 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
17990 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
179a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
179b0 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
179c0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
179d0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
179e0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
179f0 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
17a00 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
17a10 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
17a20 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
17a30 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
17a40 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
17a50 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
17a60 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
17a70 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
17a80 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
17a90 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
17aa0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17ab0 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
17ac0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
17ad0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
17ae0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
17af0 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
17b00 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
17b10 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
17b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
17b30 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
17b40 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
17b50 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
17b60 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
17b70 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
17b80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17b90 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
17ba0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17bb0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
17bc0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
17bd0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
17be0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
17bf0 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
17c00 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
17c10 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
17c20 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
17c30 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
17c40 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
17c50 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
17c60 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
17c70 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
17c80 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
17c90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
17ca0 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
17cb0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
17cc0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
17cd0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
17ce0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
17cf0 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
17d00 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
17d10 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
17d20 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
17d30 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
17d40 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
17d50 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
17d60 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
17d70 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
17d80 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
17d90 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
17da0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
17db0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
17dc0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
17dd0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
17de0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17df0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
17e00 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
17e10 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
17e20 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
17e30 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
17e40 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
17e50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
17e60 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
17e70 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
17e80 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
17e90 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
17ea0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
17eb0 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
17ec0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
17ed0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
17ee0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
17ef0 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
17f00 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
17f10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17f20 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
17f30 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
17f40 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
17f50 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
17f60 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
17f70 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
17f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17f90 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
17fa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
17fc0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
17fd0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
17fe0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
17ff0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18000 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
18010 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
18020 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
18030 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
18040 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18050 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
18060 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18070 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
18080 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
18090 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
180a0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
180b0 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
180c0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
180d0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
180f0 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
18100 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
18110 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
18120 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
18130 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
18140 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
18150 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
18160 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
18170 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
18180 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
18190 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
181a0 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
181b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
181c0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
181d0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
181e0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
181f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
18200 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
18210 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
18220 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
18230 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
18240 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
18250 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
18260 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
18270 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18280 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
18290 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
182a0 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
182b0 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
182c0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
182d0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
182e0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
182f0 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
18300 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
18310 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
18320 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
18330 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18340 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
18350 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
18360 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
18370 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
18380 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
18390 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
183a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
183b0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
183c0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
183d0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
183e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
183f0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18400 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
18410 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
18420 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
18430 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
18440 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
18450 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
18460 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
18470 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
18480 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
18490 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
184a0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
184b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
184c0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
184d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
184e0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
184f0 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
18500 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
18510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
18520 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
18530 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
18540 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18550 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18560 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
18570 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
18580 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
18590 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
185a0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
185b0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
185c0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
185d0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
185e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
185f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18600 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
18610 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18620 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
18630 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
18640 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18650 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
18660 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
18670 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
18680 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
18690 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
186a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
186b0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
186c0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
186d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
186e0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
186f0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
18700 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
18710 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
18720 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
18730 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
18740 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
18750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18760 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
18770 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
18780 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
18790 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
187a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
187b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
187c0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
187d0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
187e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
187f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
18800 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
18810 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18820 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
18830 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
18840 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
18850 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
18860 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
18870 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
18880 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
18890 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
188a0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
188b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
188c0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
188d0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
188e0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
188f0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
18900 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18910 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18920 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
18930 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
18940 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18960 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18970 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
18980 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
18990 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
189a0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
189b0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
189c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
189d0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
189e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
189f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a00 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18a10 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
18a20 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
18a30 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
18a40 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
18a50 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
18a60 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
18a70 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
18a80 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
18a90 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
18aa0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
18ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
18ac0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ae0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
18af0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18b00 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
18b10 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
18b20 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
18b30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
18b40 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
18b50 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
18b60 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
18b70 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
18b80 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
18b90 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
18ba0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
18bb0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
18bc0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
18bd0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
18be0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
18bf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18c00 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
18c10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
18c20 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
18c30 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
18c40 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
18c50 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
18c60 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
18c70 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
18c80 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
18c90 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
18ca0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
18cb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
18cc0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
18cd0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
18ce0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
18cf0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
18d00 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
18d10 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
18d20 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
18d30 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
18d40 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
18d50 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18d60 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
18d70 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
18d80 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
18d90 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
18da0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
18db0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
18dc0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
18dd0 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
18de0 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
18df0 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
18e00 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
18e10 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
18e20 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
18e30 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
18e40 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
18e50 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
18e60 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
18e70 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
18e80 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
18e90 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
18ea0 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
18eb0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
18ec0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
18ed0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
18ee0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
18ef0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
18f00 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
18f10 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
18f20 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
18f30 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
18f40 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
18f50 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
18f60 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
18f70 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
18f80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
18f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
18fa0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
18fb0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
18fc0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
18fd0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
18fe0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
18ff0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19010 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
19020 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19030 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
19040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19060 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
19070 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
19080 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
19090 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
190a0 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
190b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
190c0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
190d0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
190e0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
190f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
19100 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
19110 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
19120 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
19130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19140 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19150 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19160 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19170 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19180 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19190 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
191a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
191b0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
191c0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
191d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
191e0 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
191f0 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
19200 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
19210 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
19220 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
19230 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
19240 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
19250 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
19260 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
19270 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
19280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
19290 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
192a0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
192b0 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
192c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
192d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
192e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
192f0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19300 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
19310 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19330 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
19340 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
19350 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
19360 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
19370 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
19380 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
19390 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
193a0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
193b0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
193c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
193d0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
193e0 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
193f0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
19400 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
19410 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
19420 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
19430 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
19440 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
19450 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
19460 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
19470 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
19480 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19490 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
194a0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
194b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
194c0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
194d0 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
194e0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
194f0 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
19500 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19510 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
19520 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
19530 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
19540 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
19550 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
19560 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
19570 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
19580 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
19590 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
195a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
195b0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
195c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
195d0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
195e0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
195f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
19600 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19610 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
19620 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
19630 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
19640 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
19650 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
19660 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
19670 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
19680 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
19690 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
196a0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
196b0 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
196c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
196d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
196e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
196f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
19700 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
19710 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19720 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
19730 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
19740 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
19750 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19760 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
19770 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
19780 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19790 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
197a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
197b0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
197c0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
197d0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
197e0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
197f0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
19800 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
19810 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
19820 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
19830 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
19840 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
19850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19860 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
19870 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
19880 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
19890 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
198a0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
198b0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
198c0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
198d0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
198e0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
198f0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
19900 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
19910 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
19920 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
19930 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
19940 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
19950 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
19960 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
19970 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
19980 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
19990 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
199a0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
199b0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
199c0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
199d0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
199e0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
199f0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
19a00 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
19a10 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
19a20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
19a30 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
19a40 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
19a50 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
19a60 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19a70 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
19a80 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
19a90 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
19aa0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
19ab0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
19ac0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19ad0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19ae0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
19af0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
19b00 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
19b10 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
19b20 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
19b30 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
19b40 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
19b50 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
19b60 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
19b70 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
19b80 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
19b90 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
19ba0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
19bb0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
19bc0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
19bd0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
19be0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
19bf0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
19c00 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
19c10 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
19c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
19c30 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
19c40 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
19c50 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
19c60 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
19c70 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
19c80 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
19c90 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
19ca0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
19cb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19cc0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
19cd0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
19ce0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
19cf0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
19d00 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19d10 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
19d20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
19d30 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
19d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
19d50 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
19d60 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
19d70 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
19d80 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
19d90 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
19da0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
19db0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
19dc0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
19dd0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
19de0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
19df0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
19e00 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
19e10 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
19e20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
19e30 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
19e40 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
19e50 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
19e60 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
19e70 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
19e80 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
19e90 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
19ea0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
19eb0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
19ec0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
19ed0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
19ee0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
19ef0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
19f00 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
19f10 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
19f20 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
19f30 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
19f40 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
19f50 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
19f60 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
19f70 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
19f80 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
19f90 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
19fa0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
19fb0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
19fc0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
19fd0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
19fe0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
19ff0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1a000 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a010 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1a020 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1a030 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1a040 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1a050 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1a060 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1a070 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1a080 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1a090 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1a0a0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1a0b0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1a0c0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1a0d0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1a0e0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1a0f0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1a100 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1a110 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1a120 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1a130 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1a140 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1a150 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1a160 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1a170 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1a190 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1a1a0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1a1b0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1a1c0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1a1d0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1a1e0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1a1f0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1a200 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1a210 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1a220 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1a230 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1a240 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1a250 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1a260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1a270 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1a280 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1a290 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1a2a0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1a2b0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1a2c0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1a2d0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1a2e0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1a2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a300 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1a310 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1a320 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1a330 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1a340 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1a350 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1a360 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a370 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a380 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1a390 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1a3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a3b0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1a3c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1a3d0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3f0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1a400 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1a410 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1a420 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1a430 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1a440 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1a450 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a460 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1a470 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1a480 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1a490 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1a4a0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a4b0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1a4c0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1a4d0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1a4e0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1a4f0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1a500 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1a510 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1a520 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1a530 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1a540 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1a550 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1a560 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1a570 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1a580 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1a590 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1a5a0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1a5b0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1a5c0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1a5d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1a5e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1a5f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a600 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1a610 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1a620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a630 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1a640 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1a650 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1a660 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1a670 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1a680 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1a690 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1a6a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1a6b0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1a6c0 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1a6d0 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1a6e0 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1a6f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a700 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1a710 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1a720 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1a730 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1a740 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1a750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1a760 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1a770 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1a780 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1a790 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1a7a0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1a7b0 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1a7c0 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1a7d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a7e0 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1a7f0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1a800 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1a810 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1a820 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1a830 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1a840 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1a850 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1a860 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1a870 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1a880 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a890 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1a8a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1a8b0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1a8c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1a8d0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1a8e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a8f0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1a900 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a910 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a920 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1a930 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1a940 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1a950 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1a960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1a970 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1a980 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1a990 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1a9a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1a9b0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1a9c0 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1a9d0 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1a9e0 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1a9f0 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1aa00 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1aa10 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1aa20 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1aa30 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1aa40 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1aa50 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1aa60 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1aa70 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1aa80 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1aa90 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1aaa0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1aab0 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1aac0 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1aad0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1aae0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1aaf0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1ab00 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1ab10 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1ab20 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1ab30 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1ab40 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1ab50 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1ab60 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1ab70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1ab80 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1ab90 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1aba0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1abb0 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1abc0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1abd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1abe0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1abf0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1ac00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ac10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ac20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1ac30 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1ac40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1ac50 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1ac60 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1ac70 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1ac80 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1ac90 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1aca0 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1acb0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1acc0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1acd0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1ace0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1acf0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1ad00 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1ad10 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1ad20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1ad30 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1ad40 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1ad50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ad60 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1ad70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1ad80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ad90 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1ada0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1adb0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1adc0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1add0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1ade0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1adf0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1ae00 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1ae10 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1ae20 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1ae30 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1ae40 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1ae50 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1ae60 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1ae70 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1ae80 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1ae90 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1aea0 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1aeb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1aec0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1aed0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1aee0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1aef0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1af00 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1af10 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1af20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1af30 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1af40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1af50 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1af60 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1af70 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1af80 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1af90 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1afa0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1afb0 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1afc0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1afd0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1afe0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1aff0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1b000 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1b010 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1b020 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1b030 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1b040 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1b050 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1b060 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1b070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1b080 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b090 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1b0a0 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1b0b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1b0c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1b0d0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1b0e0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1b0f0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1b100 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1b110 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1b120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1b130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b140 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1b150 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1b160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b170 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1b180 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1b190 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1b1a0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1b1b0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1b1c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1b1d0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b1e0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b1f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b200 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1b210 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1b220 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1b230 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1b240 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1b250 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1b260 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1b270 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1b280 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1b290 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1b2a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1b2b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1b2c0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1b2d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b2e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1b2f0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b310 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b320 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1b330 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1b340 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1b350 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1b360 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1b370 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b380 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1b390 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1b3a0 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1b3b0 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1b3c0 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1b3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1b3e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1b3f0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1b400 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1b410 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1b420 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1b430 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1b440 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b450 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1b460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
1b480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b490 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
1b4a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b4b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b4c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1b4d0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1b4e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1b4f0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1b500 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1b510 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1b520 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1b530 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1b540 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1b550 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1b560 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1b570 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1b580 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1b590 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1b5a0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1b5b0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1b5c0 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1b5d0 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1b5e0 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1b600 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1b610 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1b620 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1b630 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1b640 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1b650 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1b660 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1b670 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1b680 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1b690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1b6a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b6b0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1b6c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1b6d0 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1b6e0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1b6f0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1b700 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1b710 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1b720 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1b730 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1b740 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1b750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1b760 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1b770 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1b780 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1b790 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1b7a0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1b7b0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1b7c0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1b7d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1b7e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1b7f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1b800 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1b810 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b820 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1b830 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1b840 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1b850 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1b860 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1b870 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b880 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1b890 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1b8a0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1b8b0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1b8c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b8d0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1b8e0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1b8f0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1b900 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1b910 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1b920 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1b930 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1b940 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1b950 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1b960 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
1b970 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1b980 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
1b990 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1b9a0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
1b9b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1b9c0 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
1b9d0 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
1b9e0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1b9f0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1ba00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1ba10 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1ba20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1ba30 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1ba40 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1ba50 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ba60 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1ba70 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1ba80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1ba90 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1baa0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1bab0 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1bac0 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1bad0 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1bae0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1baf0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1bb00 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1bb10 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1bb20 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1bb30 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1bb40 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1bb50 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1bb60 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1bb70 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1bb80 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1bb90 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1bba0 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1bbb0 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1bbc0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1bbd0 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1bbe0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1bbf0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1bc00 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1bc10 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1bc20 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1bc30 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1bc40 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1bc50 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1bc60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bc70 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1bc80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1bc90 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1bca0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1bcb0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1bcc0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1bcd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1bce0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1bcf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1bd00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1bd10 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
1bd20 65 72 2d 3e 6e 6f 53 79 6e 63 20 0a 20 20 20 26  er->noSync .   &
1bd30 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1bd40 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1bd50 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1bd60 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1bd70 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1bd80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1bd90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
1bda0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
1bdb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1bdc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bdd0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1bde0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1bdf0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1be00 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
1be10 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1be20 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1be30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1be40 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1be50 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1be60 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1be70 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1be80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1be90 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1bea0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1beb0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1bec0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1bed0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1bee0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1bef0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1bf00 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1bf10 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1bf20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1bf30 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
1bf40 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1bf50 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
1bf60 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
1bf70 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
1bf80 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
1bf90 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1bfa0 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
1bfb0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
1bfc0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
1bfd0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
1bfe0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
1bff0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
1c000 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1c010 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1c020 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c030 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1c040 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
1c050 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1c060 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20  e file and into 
1c070 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20  .** pPg->pData. 
1c080 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72  A shared lock or
1c090 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
1c0a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1c0b0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65  abase.** file be
1c0c0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1c0d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
1c0e0 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73  .** If page 1 is
1c0f0 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20   read, then the 
1c100 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
1c110 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73  bFileVers[] is s
1c120 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c  et to.** the val
1c130 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
1c140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1c150 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
1c160 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1c170 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69  n the IO error i
1c180 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1c190 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68  e caller..** Oth
1c1a0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1c1b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
1c1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1c1d0 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70  dDbPage(PgHdr *p
1c1e0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1c1f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c200 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1c210 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1c220 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1c230 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1c240 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1c250 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1c260 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1c270 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1c280 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c290 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1c2a0 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20  isInWal = 0;    
1c2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c2c0 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c   if page is in l
1c2d0 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  og file */.  int
1c2e0 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1c2f0 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1c300 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1c310 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1c320 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1c330 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1c340 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1c350 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c360 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
1c370 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65  if( NEVER(!isOpe
1c380 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
1c390 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c3a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c3b0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  ;.    memset(pPg
1c3c0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
1c3d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c3e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c3f0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
1c400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1c410 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  er) ){.    /* Tr
1c420 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61  y to pull the pa
1c430 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74  ge from the writ
1c440 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a  e-ahead log. */.
1c450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c460 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e  WalRead(pPager->
1c470 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49  pWal, pgno, &isI
1c480 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d  nWal, pgsz, pPg-
1c490 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69  >pData);.  }.  i
1c4a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c4b0 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a   && !isInWal ){.
1c4c0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1c4d0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1c4e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c4f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1c500 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1c510 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1c520 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1c530 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c540 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1c550 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1c560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c570 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1c580 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1c590 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1c5a0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1c5b0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1c5c0 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1c5d0 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1c5e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1c5f0 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1c600 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1c610 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1c620 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1c630 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1c640 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1c650 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1c660 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1c670 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1c680 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1c690 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1c6a0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1c6b0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1c6c0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1c6d0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1c6e0 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1c6f0 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1c700 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1c710 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c720 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1c730 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1c740 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1c750 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1c760 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1c770 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1c780 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1c790 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1c7a0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1c7b0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1c7c0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1c7d0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1c7e0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1c7f0 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
1c800 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1c810 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1c820 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1c830 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1c840 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1c850 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1c860 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1c870 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1c880 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1c890 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1c8a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1c8b0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1c8c0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1c8d0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1c8e0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1c8f0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1c900 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c910 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1c920 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1c930 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1c940 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1c950 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c960 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1c970 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1c980 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1c990 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1c9a0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1c9b0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1c9c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c9d0 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1c9e0 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1c9f0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1ca00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ca10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1ca20 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1ca30 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1ca40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1ca50 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ca60 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1ca70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ca80 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1ca90 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1caa0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1cab0 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1cac0 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1cad0 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1cae0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1caf0 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1cb00 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1cb10 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1cb20 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1cb30 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1cb40 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1cb50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1cb60 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1cb70 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1cb80 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1cb90 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1cba0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1cbb0 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1cbc0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1cbd0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1cbe0 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1cbf0 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1cc00 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1cc10 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1cc20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1cc30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1cc40 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1cc50 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1cc60 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1cc70 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1cc80 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1cc90 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1cca0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1ccb0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1ccc0 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1ccd0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1cce0 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1ccf0 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1cd00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cd10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cd20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1cd30 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1cd40 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1cd50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1cd60 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1cd70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1cd80 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1cd90 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1cda0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cdb0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1cdc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cdd0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1cde0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
1cdf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ce00 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1ce10 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1ce20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ce30 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ce40 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ef(pPg);.    }. 
1ce50 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1ce60 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1ce70 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1ce80 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1ce90 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1cea0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1ceb0 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1cec0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1ced0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1cee0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1cef0 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1cf00 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1cf10 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1cf20 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1cf30 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1cf40 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1cf50 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1cf60 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1cf70 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1cf80 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1cf90 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1cfa0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1cfb0 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1cfc0 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1cfd0 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1cfe0 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1cff0 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1d000 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1d010 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1d020 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1d030 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1d040 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1d050 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1d060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d080 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1d090 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1d0a0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1d0b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1d0c0 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1d0d0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1d0e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1d110 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1d120 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1d130 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1d140 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1d150 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1d160 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1d170 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1d180 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1d190 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1d1a0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1d1b0 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1d1c0 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1d1d0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1d1e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1d1f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1d200 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1d210 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1d220 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1d230 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1d240 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1d250 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1d260 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1d270 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1d280 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1d290 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1d2a0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1d2b0 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1d2c0 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1d2d0 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1d2e0 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1d2f0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1d300 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1d310 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1d320 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1d330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d340 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1d350 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1d360 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1d370 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1d380 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1d390 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1d3a0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1d3b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d3c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d3d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1d3e0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1d3f0 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1d400 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1d410 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1d420 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1d430 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1d440 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1d450 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1d460 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1d470 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1d480 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1d490 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1d4a0 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1d4b0 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69  nged. .*/ .stati
1d4c0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1d4d0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1d4e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1d500 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1d510 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d530 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1d540 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1d550 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1d560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1d570 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1d580 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1d590 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1d5c0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1d5d0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61  /.  int sync_fla
1d5e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1d5f0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1d600 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1d610 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1d620 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1d650 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d660 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 72  ger->pWal );.  r
1d670 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1d680 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1d690 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1d6a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1d6b0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1d6c0 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61  Commit, sync_fla
1d6d0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1d6e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d6f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1d700 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1d710 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1d720 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1d730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1d740 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1d750 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1d760 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1d770 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1d780 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d790 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 7b 0a  CHECK_PAGES.  {.
1d7a0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1d7b0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1d7c0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 20 70  ; p=p->pDirty) p
1d7d0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1d7e0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1d7f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d800 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1d810 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1d820 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1d830 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d840 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1d850 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1d860 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1d870 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1d880 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1d890 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1d8a0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1d8b0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1d8c0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1d8d0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1d8e0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1d8f0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1d900 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1d910 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1d920 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1d930 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1d940 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1d950 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1d960 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1d970 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d9a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1d9b0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1d9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d9d0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1d9e0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1d9f0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1da00 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1da10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1da20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1da30 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1da40 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1da50 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1da60 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1da70 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1da80 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1da90 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1daa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1dab0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1dac0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1dad0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1dae0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1daf0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1db00 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1db10 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1db20 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1db30 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1db40 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1db50 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1db60 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1db70 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1db80 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1db90 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1dba0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1dbb0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1dbc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dbd0 26 26 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  && changed ){.  
1dbe0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1dbf0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
1dc00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dc10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dc20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1dc30 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
1dc40 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
1dc50 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
1dc60 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
1dc70 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1dc80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1dc90 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
1dca0 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
1dcb0 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
1dcc0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1dcd0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
1dce0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
1dcf0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
1dd00 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dd10 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1dd20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1dd30 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
1dd40 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
1dd50 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1dd60 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
1dd70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
1dd80 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
1dd90 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1dda0 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
1ddb0 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
1ddc0 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
1ddd0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1dde0 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
1ddf0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1de20 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1de30 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
1de40 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1de50 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
1de60 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
1de70 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
1de80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1de90 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
1dea0 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
1deb0 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
1dec0 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
1ded0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1dee0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1def0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1df00 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
1df10 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1df20 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1df30 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
1df40 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
1df50 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
1df60 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
1df70 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
1df80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1df90 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1dfa0 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1dfb0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1dfc0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  >=SHARED_LOCK ||
1dfd0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
1dfe0 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  ock );.  nPage =
1dff0 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1e000 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1e010 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
1e020 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1e030 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1e040 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1e050 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65  ystem,.  ** dete
1e060 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f  rmine it based o
1e070 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1e080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e090 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a   If the size.  *
1e0a0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
1e0b0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1e0c0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1e0d0 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1e0e0 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64  ze,.  ** round d
1e0f0 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65  own to the neare
1e100 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c  st page. Except,
1e110 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72   any file larger
1e120 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74   than 0.  ** byt
1e130 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
1e140 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74  nsidered to cont
1e150 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
1e160 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1e170 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1e180 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
1e1b0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1e1c0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1e1d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1e1e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1e1f0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
1e200 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1e210 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1e220 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1e230 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1e240 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
1e250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e260 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e270 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1e280 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
1e290 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
1e2a0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
1e2b0 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e  f( nPage==0 && n
1e2c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  >0 ){.      nPag
1e2d0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
1e2e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1e2f0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
1e300 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
1e310 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
1e320 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  n the.  ** confi
1e330 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
1e340 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
1e350 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
1e360 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
1e370 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
1e380 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
1e390 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
1e3a0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1e3b0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1e3c0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
1e3d0 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
1e3e0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1e3f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1e400 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1e410 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1e420 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1e430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1e440 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1e450 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1e460 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1e470 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1e480 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1e490 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1e4a0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1e4b0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1e4c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1e4d0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1e4e0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1e4f0 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1e500 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1e510 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1e520 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1e530 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1e540 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1e550 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1e560 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1e570 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1e580 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1e590 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1e5a0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1e5b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1e5c0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1e5d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1e5e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1e5f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1e600 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1e610 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1e620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1e630 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1e640 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1e650 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1e660 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1e670 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1e680 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1e690 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1e6a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1e6b0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1e6c0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1e6d0 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1e6e0 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1e6f0 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1e700 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1e710 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1e720 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1e730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e740 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1e750 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1e760 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1e770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1e780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1e790 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1e7a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e7b0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1e7c0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  ED_LOCK || pPage
1e7d0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b  r->noReadlock );
1e7e0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1e7f0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
1e800 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e820 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
1e830 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
1e840 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e860 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
1e870 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1e880 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
1e890 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
1e8a0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
1e8b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e8c0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1e8d0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e8e0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1e8f0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1e900 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
1e910 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b        isWal = 0;
1e920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e940 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
1e950 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20    pPager->pVfs, 
1e960 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51  pPager->zWal, SQ
1e970 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1e980 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20  TS, &isWal.     
1e990 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
1e9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e9b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57  ){.      if( isW
1e9c0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  al ){.        te
1e9d0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50  stcase( sqlite3P
1e9e0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
1e9f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
1ea00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
1ea10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1ea20 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
1ea30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1ea40 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1ea50 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1ea60 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
1ea70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1ea80 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
1ea90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1eaa0 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
1eab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1eac0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1ead0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1eae0 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
1eaf0 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
1eb00 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
1eb10 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
1eb20 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
1eb30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1eb40 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
1eb50 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
1eb60 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
1eb70 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
1eb80 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
1eb90 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
1eba0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
1ebb0 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
1ebc0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
1ebd0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
1ebe0 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
1ebf0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
1ec00 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
1ec10 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
1ec20 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
1ec30 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
1ec40 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
1ec50 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
1ec60 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
1ec70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
1ec80 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
1ec90 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1eca0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1ecb0 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
1ecc0 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
1ecd0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
1ece0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
1ecf0 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
1ed00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1ed10 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
1ed20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
1ed30 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
1ed40 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
1ed50 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1ed60 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
1ed70 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
1ed80 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1ed90 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
1eda0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
1edb0 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
1edc0 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
1edd0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
1ede0 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
1edf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
1ee00 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1ee10 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
1ee20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
1ee30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
1ee40 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
1ee50 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
1ee60 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1ee70 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
1ee80 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
1ee90 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
1eea0 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
1eeb0 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
1eec0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
1eed0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
1eee0 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
1eef0 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
1ef00 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
1ef10 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
1ef20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1ef30 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
1ef40 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
1ef50 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
1ef60 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
1ef70 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
1ef80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
1ef90 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
1efa0 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
1efb0 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
1efc0 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
1efd0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1efe0 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
1eff0 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
1f000 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
1f010 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
1f020 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
1f030 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
1f040 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
1f050 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1f060 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
1f070 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
1f080 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1f090 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
1f0a0 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
1f0b0 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
1f0c0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
1f0d0 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
1f0e0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
1f0f0 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
1f100 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1f110 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
1f120 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
1f130 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
1f140 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
1f150 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
1f160 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
1f170 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
1f180 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
1f190 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
1f1a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1f1b0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
1f1c0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
1f1d0 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
1f1e0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
1f1f0 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f210 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
1f220 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1f230 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
1f240 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
1f250 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
1f260 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
1f270 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
1f280 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
1f290 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1f2a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f2b0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
1f2c0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
1f2d0 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
1f2e0 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
1f2f0 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
1f300 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f310 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1f320 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
1f330 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f340 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1f350 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
1f360 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
1f370 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
1f380 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
1f390 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
1f3a0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
1f3b0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
1f3c0 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
1f3d0 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
1f3e0 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
1f3f0 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
1f400 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f410 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1f420 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1f430 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
1f440 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
1f450 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
1f460 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
1f470 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
1f480 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
1f490 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1f4a0 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
1f4b0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
1f4c0 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
1f4d0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
1f4e0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1f4f0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1f500 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1f510 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
1f520 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f530 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
1f540 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1f550 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
1f560 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
1f570 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
1f580 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
1f590 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
1f5a0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
1f5b0 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
1f5c0 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
1f5d0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
1f5e0 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
1f5f0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1f600 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
1f610 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
1f620 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
1f630 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
1f640 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
1f650 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
1f660 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
1f670 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1f680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
1f690 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
1f6a0 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
1f6b0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
1f6c0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
1f6d0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
1f6e0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
1f6f0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
1f700 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
1f710 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
1f720 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
1f730 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
1f740 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
1f750 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
1f760 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
1f770 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
1f780 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
1f790 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1f7a0 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
1f7b0 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
1f7c0 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
1f7d0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
1f7e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
1f7f0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
1f800 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
1f810 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
1f820 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
1f830 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
1f840 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
1f850 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
1f860 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
1f870 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
1f880 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
1f890 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
1f8a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f8b0 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
1f8c0 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
1f8d0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1f8e0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1f8f0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
1f900 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
1f910 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1f920 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1f930 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
1f940 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
1f950 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1f960 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1f970 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
1f980 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
1f990 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1f9a0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
1f9b0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
1f9c0 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
1f9d0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1f9e0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
1f9f0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
1fa00 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
1fa10 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
1fa20 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
1fa30 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
1fa40 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
1fa50 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
1fa60 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
1fa70 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
1fa80 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
1fa90 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
1faa0 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
1fab0 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
1fac0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1fad0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
1fae0 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
1faf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1fb00 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1fb10 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
1fb20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
1fb30 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
1fb40 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
1fb50 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
1fb60 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1fb70 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
1fb80 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
1fb90 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1fba0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
1fbb0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
1fbc0 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
1fbd0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1fbe0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1fbf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
1fc00 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
1fc10 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
1fc20 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
1fc30 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
1fc40 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
1fc50 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
1fc60 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
1fc70 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1fc80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fc90 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
1fca0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1fcb0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1fcc0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1fcd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
1fce0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
1fcf0 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
1fd00 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1fd10 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
1fd20 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1fd30 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
1fd40 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1fd50 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
1fd60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fd70 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
1fd80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1fd90 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1fda0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
1fdb0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
1fdc0 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
1fdd0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1fde0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1fdf0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
1fe00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1fe10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fe20 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
1fe30 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
1fe40 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
1fe50 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1fe60 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
1fe70 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
1fe80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
1fe90 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1fea0 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
1feb0 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
1fec0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
1fed0 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
1fee0 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
1fef0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
1ff00 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
1ff10 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
1ff20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1ff30 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1ff40 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61  i64 offset = pSa
1ff50 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
1ff60 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1ff70 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
1ff80 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1ff90 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1ffa0 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
1ffb0 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
1ffc0 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
1ffd0 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
1ffe0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
1fff0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
20000 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
20010 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
20020 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
20030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
20040 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61  ffset==ii*(4+pPa
20050 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
20060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
20070 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
20080 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
20090 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
200a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
200b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
200c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
200d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
200e0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
200f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20100 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
20110 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
20120 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20130 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
20140 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
20150 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
20160 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
20170 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
20180 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20190 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
201a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
201b0 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
201c0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
201d0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
201e0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
201f0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
20200 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
20210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
20220 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
20230 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
20240 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
20250 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
20260 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
20270 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
20280 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
20290 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
202a0 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
202b0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
202c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
202d0 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
202e0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
202f0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
20300 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
20310 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
20320 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
20330 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
20340 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
20350 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
20360 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
20370 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
20380 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
20390 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
203a0 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
203b0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
203c0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
203d0 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
203e0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
203f0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
20400 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
20410 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
20420 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
20430 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
20440 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
20450 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
20460 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
20470 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
20480 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
20490 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
204a0 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
204b0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
204c0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
204d0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
204e0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
204f0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
20510 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
20520 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
20530 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
20540 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
20550 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
20560 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
20570 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
20580 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
20590 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
205a0 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
205b0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
205c0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
205d0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
205e0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
205f0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
20600 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
20620 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
20630 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
20640 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
20650 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
20660 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
20670 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
20680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
20690 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
206a0 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
206b0 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
206c0 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
206d0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
206e0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
206f0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
20700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
20710 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
20720 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
20730 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
20740 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
20750 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
20760 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
20770 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
20780 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
20790 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
207a0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
207b0 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
207c0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
207d0 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
207e0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
207f0 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
20800 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
20810 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
20820 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
20830 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
20840 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
20850 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
20860 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
20870 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
20880 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
20890 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
208a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
208b0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
208c0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
208d0 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
208e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
208f0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
20900 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
20910 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
20920 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
20930 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
20940 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
20950 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
20960 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20970 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
20980 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
20990 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
209a0 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
209b0 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
209c0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
209d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
209e0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
209f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
20a00 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
20a10 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
20a20 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
20a30 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
20a40 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
20a50 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
20a60 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
20a70 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
20a80 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
20a90 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
20aa0 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
20ab0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
20ac0 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
20ad0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
20ae0 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
20af0 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
20b00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
20b10 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
20b20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
20b30 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
20b40 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
20b50 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
20b60 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
20b70 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
20b80 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
20b90 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
20ba0 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
20bb0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20bc0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20bd0 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
20be0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
20bf0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
20c00 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
20c10 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
20c20 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
20c30 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
20c40 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
20c50 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
20c60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
20c70 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
20c80 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
20c90 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
20ca0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
20cb0 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
20cc0 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
20cd0 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
20ce0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
20cf0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20d00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
20d10 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
20d20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20d30 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
20d40 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
20d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
20d60 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
20d70 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
20d80 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
20d90 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
20da0 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
20db0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
20dc0 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
20dd0 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
20de0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
20df0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
20e00 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
20e10 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
20e20 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
20e30 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
20e40 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
20e50 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
20e60 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
20e70 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
20e80 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
20e90 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
20ea0 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
20eb0 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
20ec0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
20ed0 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
20ee0 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
20f10 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
20f20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
20f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
20f60 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
20f70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
20f80 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
20f90 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
20fa0 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
20fb0 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
20fc0 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
20fd0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
20fe0 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
20ff0 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
21000 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
21010 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
21020 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
21030 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
21040 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
21050 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
21060 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
21070 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
21080 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
21090 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
210a0 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
210b0 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
210c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
210d0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
210e0 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
210f0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
21100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
21110 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
21120 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
21130 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
21140 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
21150 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
21160 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
21170 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
21180 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
21190 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
211a0 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
211b0 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
211c0 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
211d0 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
211e0 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
211f0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
21200 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
21210 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rg;.}../*.** Cha
21220 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
21230 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
21240 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
21250 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
21260 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
21270 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
21280 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
21290 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
212a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
212b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
212c0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
212d0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
212e0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
212f0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
21300 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
21310 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
21320 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
21330 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
21340 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
21350 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
21360 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
21370 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
21380 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
21390 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
213a0 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
213b0 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
213c0 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
213d0 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
213e0 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
213f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
21400 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
21410 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
21420 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
21430 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
21440 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
21450 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21460 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
21470 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
21480 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
21490 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
214a0 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
214b0 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
214c0 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
214d0 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
214e0 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
214f0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
21500 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
21510 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
21520 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
21530 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
21540 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
21550 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
21560 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
21570 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
21580 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
21590 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
215a0 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
215b0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
215c0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
215d0 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
215e0 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
215f0 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
21600 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
21610 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
21620 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
21630 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
21640 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
21650 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
21660 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
21670 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
21680 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
21690 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
216a0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
216b0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
216c0 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
216d0 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
216e0 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
216f0 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
21700 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
21710 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
21720 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
21730 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21750 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
21760 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21770 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
21780 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
21790 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
217a0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
217b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
217c0 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
217d0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
217e0 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
217f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
21800 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
21810 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
21820 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
21830 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
21840 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
21850 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
21860 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
21870 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
21880 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21890 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
218a0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
218b0 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
218c0 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
218d0 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
218e0 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
218f0 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
21900 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
21910 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
21920 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
21930 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
21940 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
21950 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
21960 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
21970 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
21980 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
21990 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
219a0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
219b0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
219c0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
219d0 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
219e0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
219f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
21a00 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
21a10 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
21a20 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
21a30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
21a40 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
21a50 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
21a60 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
21a70 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a90 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
21aa0 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
21ab0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
21ac0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
21ad0 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
21ae0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
21af0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21b00 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
21b10 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
21b20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21b40 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
21b50 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
21b60 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
21b70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
21b80 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
21b90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
21ba0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
21bc0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
21bd0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
21be0 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
21bf0 29 28 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65  )(nByte/pageSize
21c00 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
21c10 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
21c20 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
21c30 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
21c40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
21c50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
21c60 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
21c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
21c80 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
21c90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
21ca0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
21cb0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
21cc0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
21cd0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
21ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21cf0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
21d00 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
21d10 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
21d20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
21d30 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
21d40 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
21d50 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
21d60 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
21d70 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
21d80 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
21d90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21da0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21db0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21dc0 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
21dd0 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
21de0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
21df0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
21e00 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
21e10 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
21e20 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
21e30 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
21e40 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
21e50 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
21e60 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
21e70 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
21e80 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
21e90 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
21ea0 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
21eb0 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
21ec0 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
21ed0 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
21ee0 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
21ef0 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
21f00 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
21f10 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
21f20 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
21f30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21f40 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21f50 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
21f60 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
21f70 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
21f80 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
21f90 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
21fa0 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
21fb0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
21fc0 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
21fd0 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
21fe0 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
21ff0 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
22000 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
22010 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
22020 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
22030 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
22040 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
22050 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
22060 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
22070 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
22080 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
22090 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
220a0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
220b0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
220c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
220d0 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
220e0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
220f0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
22100 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 6d  PEN && pPager->m
22110 78 50 67 6e 6f 3c 70 50 61 67 65 72 2d 3e 64 62  xPgno<pPager->db
22120 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Size ){.    pPag
22130 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 70 50 61  er->mxPgno = pPa
22140 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
22150 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
22160 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
22170 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22180 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
22190 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
221a0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
221b0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
221c0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
221d0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
221e0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
221f0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
22200 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
22210 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
22220 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
22230 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
22240 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
22250 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
22260 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
22270 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
22280 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
22290 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
222a0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
222b0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
222c0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
222d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
222e0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
222f0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
22300 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
22310 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
22320 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
22330 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
22340 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
22350 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
22360 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
22370 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
22380 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
22390 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
223a0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
223b0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
223c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
223d0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
223e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
223f0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
22400 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
22410 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
22420 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
22430 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
22440 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
22450 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
22460 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
22470 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
22480 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
22490 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
224a0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
224b0 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
224c0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
224d0 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
224e0 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
224f0 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
22500 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
22510 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
22520 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
22530 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
22540 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
22550 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
22560 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
22570 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
22580 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
22590 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
225a0 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
225b0 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
225c0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
225d0 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
225e0 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
225f0 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
22600 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
22610 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
22620 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
22630 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
22640 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
22650 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
22660 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
22670 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
22680 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
22690 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
226a0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
226b0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
226c0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
226d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
226e0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
226f0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
22700 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
22710 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
22720 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
22730 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
22740 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
22750 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
22760 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
22770 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
22780 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
22790 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
227a0 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
227b0 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
227c0 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
227d0 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
227e0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
227f0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
22800 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
22810 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
22820 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
22830 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
22840 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
22850 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
22860 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
22870 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
22880 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
22890 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
228a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
228b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
228c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
228d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
228e0 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
228f0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
22900 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22910 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
22920 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
22930 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
22940 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
22950 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
22960 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
22970 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
22980 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
22990 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
229a0 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
229b0 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
229c0 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
229d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
229e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
229f0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22a00 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
22a10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
22a20 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
22a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
22a40 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
22a50 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
22a60 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
22a70 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
22a80 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
22a90 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
22aa0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
22ab0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
22ac0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
22ad0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
22ae0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
22af0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
22b00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22b10 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
22b20 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
22b30 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
22b40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
22b50 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
22b60 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
22b70 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
22b80 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
22b90 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
22ba0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
22bb0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
22bc0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
22bd0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
22be0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
22bf0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
22c00 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
22c10 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
22c20 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
22c30 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
22c40 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
22c50 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
22c60 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
22c70 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
22c80 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
22c90 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
22ca0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
22cb0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
22cc0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
22cd0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
22ce0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
22cf0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
22d00 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
22d10 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
22d20 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
22d60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
22d70 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
22d80 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
22d90 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
22da0 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
22db0 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
22dc0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
22dd0 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
22de0 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
22df0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
22e00 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
22e10 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
22e20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
22e30 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
22e40 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
22e50 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
22e60 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
22e70 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
22e80 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
22e90 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
22ea0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
22eb0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
22ec0 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
22ed0 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
22ee0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
22ef0 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
22f00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
22f10 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
22f20 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
22f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
22f40 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
22f50 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
22f60 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
22f70 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
22f80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
22f90 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
22fa0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
22fb0 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
22fc0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
22fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
22fe0 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
22ff0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
23000 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
23010 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
23020 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
23030 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
23040 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
23050 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
23060 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
23070 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
23080 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
23090 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
230a0 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
230b0 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
230c0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
230d0 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
230e0 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
230f0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
23100 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
23110 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
23120 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
23130 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
23140 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
23150 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
23160 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
23170 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
23180 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
23190 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
231a0 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
231b0 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
231c0 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
231d0 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
231e0 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
231f0 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
23200 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
23210 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
23220 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
23230 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
23240 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
23250 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
23260 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
23270 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
23280 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
23290 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  our would be to 
232a0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
232b0 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
232c0 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
232d0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
232e0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
232f0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
23300 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
23310 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
23320 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
23330 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
23340 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
23350 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
23360 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
23370 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
23380 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
23390 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
233a0 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
233b0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
233c0 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
233d0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
233e0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
233f0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
23400 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
23410 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
23420 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
23430 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
23440 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
23450 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
23460 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
23470 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
23480 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
23490 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
234a0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
234b0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
234c0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
234d0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
234e0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
234f0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
23500 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
23510 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
23520 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
23530 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
23540 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
23550 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
23560 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
23570 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
23580 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
23590 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
235a0 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
235b0 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
235c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
235d0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
235e0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
235f0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
23600 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
23610 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
23620 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
23630 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
23640 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
23650 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
23660 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
23670 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
23680 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
23690 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
236a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
236b0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
236c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
236d0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
236e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
236f0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
23700 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
23710 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23720 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
23730 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
23740 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a  nt(pPager);.}...
23750 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23760 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
23770 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
23780 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
23790 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
237a0 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
237b0 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
237c0 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
237d0 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
237e0 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
237f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
23800 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
23810 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
23820 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
23830 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
23840 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
23850 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
23860 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
23870 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
23880 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
23890 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
238a0 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
238b0 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
238c0 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
238d0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
238e0 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
238f0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
23900 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
23910 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
23920 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
23930 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
23940 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
23950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
23960 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
23970 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
23980 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
23990 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
239a0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
239b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
239c0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
239d0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
239e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
239f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
23a00 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
23a10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
23a20 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
23a30 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
23a40 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
23a50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
23a70 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
23a80 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
23a90 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
23aa0 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
23ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23ac0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
23ad0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
23ae0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
23af0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
23b00 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
23b10 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
23b20 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
23b30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
23b40 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
23b50 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
23b60 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
23b70 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
23b80 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
23b90 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
23ba0 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
23bb0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
23bc0 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
23bd0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
23be0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
23bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
23c00 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
23c10 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
23c20 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
23c30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
23c40 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
23c50 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
23c60 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
23c70 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
23c80 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
23c90 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
23ca0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
23cb0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
23cc0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
23cd0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
23ce0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
23cf0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
23d00 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
23d10 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23d20 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
23d30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
23d40 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
23d50 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23d60 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  e;..  disable_si
23d70 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
23d80 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
23d90 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
23da0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
23db0 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
23dc0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
23dd0 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
23de0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23df0 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
23e00 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
23e10 57 61 6c 2c 0a 20 20 20 20 28 70 50 61 67 65 72  Wal,.    (pPager
23e20 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70  ->noSync ? 0 : p
23e30 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
23e40 73 29 2c 20 0a 20 20 20 20 70 50 61 67 65 72 2d  s), .    pPager-
23e50 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a  >pageSize, pTmp.
23e60 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70    );.  pPager->p
23e70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
23e80 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
23e90 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
23ea0 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
23eb0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
23ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
23ed0 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
23ee0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
23ef0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
23f00 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
23f10 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
23f20 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
23f30 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
23f40 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
23f50 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
23f60 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
23f70 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
23f80 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
23f90 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
23fa0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
23fb0 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
23fc0 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
23fd0 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
23fe0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
23ff0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
24000 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24010 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
24020 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
24030 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
24040 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
24050 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
24060 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
24070 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
24080 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
24090 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
240a0 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
240b0 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
240c0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
240d0 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
240e0 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
240f0 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
24100 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
24110 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
24120 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
24130 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
24140 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
24150 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
24160 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
24170 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
24180 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
24190 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
241a0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
241b0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
241c0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
241d0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
241e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
241f0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
24200 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
24210 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
24220 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
24230 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
24240 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
24250 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
24260 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
24270 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
24280 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
24290 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
242a0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
242b0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
242c0 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
242d0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
242e0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
242f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
24300 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
24310 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
24320 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
24330 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
24340 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
24350 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
24360 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
24370 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
24380 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
24390 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
243a0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
243b0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
243c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
243d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
243e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
243f0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
24400 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
24410 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
24420 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24430 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
24440 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
24450 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
24460 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
24470 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
24480 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
24490 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
244a0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
244b0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
244c0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
244d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
244e0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
244f0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
24500 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
24510 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
24520 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
24530 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
24540 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
24550 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
24560 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
24570 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
24580 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
24590 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
245a0 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
245b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
245c0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
245d0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
245e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
245f0 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
24600 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
24610 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
24620 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
24630 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
24640 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
24650 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
24660 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
24670 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
24680 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
24690 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
246a0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
246b0 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
246c0 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
246d0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
246e0 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
246f0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
24700 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
24710 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
24720 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
24730 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
24740 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
24750 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
24760 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
24770 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
24780 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
24790 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
247a0 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
247b0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
247c0 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
247d0 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
247e0 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
247f0 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
24800 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
24810 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
24820 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
24830 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
24840 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
24850 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
24860 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
24870 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
24880 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
24890 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
248a0 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
248b0 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
248c0 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
248d0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
248e0 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
248f0 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
24900 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
24910 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
24920 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
24930 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
24940 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
24950 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
24960 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
24970 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
24980 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
24990 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
249a0 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
249b0 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
249c0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
249d0 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
249e0 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
249f0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
24a00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
24a10 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
24a20 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
24a30 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
24a40 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
24a50 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
24a60 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
24a70 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
24a80 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
24a90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
24aa0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
24ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
24ac0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
24ad0 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
24ae0 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
24b10 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
24b20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24b30 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
24b40 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
24b50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
24b60 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
24b70 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
24b80 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
24b90 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
24ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
24bb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
24bc0 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
24bd0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
24be0 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
24bf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24c00 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
24c10 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
24c20 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
24c30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
24c40 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
24c50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
24c60 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
24c70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
24c80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
24c90 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
24ca0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
24cb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
24cc0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24cd0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
24ce0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
24cf0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
24d00 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
24d10 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
24d20 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
24d30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24d40 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
24d50 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
24d60 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
24d70 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
24d80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
24d90 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
24da0 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
24db0 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
24dc0 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
24dd0 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
24de0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24df0 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
24e00 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
24e10 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
24e20 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
24e30 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
24e40 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
24e50 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
24e60 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
24e70 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
24e80 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
24e90 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
24ea0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
24eb0 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
24ec0 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
24ed0 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
24ee0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
24ef0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
24f00 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
24f10 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
24f20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
24f30 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
24f40 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
24f50 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
24f60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
24f70 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
24f80 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
24f90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
24fa0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
24fb0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
24fc0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
24fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
24fe0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
24ff0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
25000 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
25010 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
25020 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
25030 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
25040 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
25050 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
25060 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
25070 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
25080 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
25090 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
250a0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
250b0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
250c0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
250d0 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
250e0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
250f0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
25100 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
25110 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
25120 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
25130 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
25140 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
25150 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
25160 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
25170 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
25180 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
25190 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
251a0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
251b0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
251c0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
251d0 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
251e0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
251f0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
25200 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
25210 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
25220 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
25230 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
25240 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
25250 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
25260 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
25270 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
25280 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
25290 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
252a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
252b0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
252c0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
252d0 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
252e0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
252f0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
25300 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
25310 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
25320 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
25330 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
25340 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
25350 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
25360 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
25370 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
25380 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
25390 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
253a0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
253b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
253c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
253d0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
253e0 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
253f0 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
25400 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25410 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
25420 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
25430 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
25440 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
25450 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
25460 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
25470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25480 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
25490 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
254a0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
254b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
254c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
254d0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
254e0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
254f0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
25500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25510 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
25520 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
25530 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
25540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
25550 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
25560 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
25570 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
25580 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
25590 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
255a0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
255b0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
255c0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
255d0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
255e0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
255f0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
25600 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
25610 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
25620 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
25630 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
25640 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
25650 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
25660 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
25670 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
25680 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
25690 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
256a0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
256b0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
256c0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
256d0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
256e0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
256f0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
25700 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
25710 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
25720 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
25730 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
25740 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
25750 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
25760 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
25770 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
25780 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
25790 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
257a0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
257b0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
257c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
257d0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
257e0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
257f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
25800 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
25810 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
25820 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
25830 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
25840 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
25850 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
25860 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
25870 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
25880 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
25890 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
258a0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
258b0 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
258c0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
258d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
258e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
258f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
25900 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
25910 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
25920 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
25930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25940 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
25950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
25960 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
25970 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
25980 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
25990 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
259a0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
259b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
259c0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
259d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
259e0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
259f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
25a00 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
25a10 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
25a20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
25a30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
25a40 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a  r->sync_flags| .
25a50 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
25a60 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53  r->sync_flags==S
25a70 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
25a80 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
25a90 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
25aa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25ab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
25ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
25ad0 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
25ae0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
25af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
25b00 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
25b10 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
25b20 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
25b30 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
25b40 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
25b50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
25b60 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
25b70 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
25b80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25b90 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
25ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25bb0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
25bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
25bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25be0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
25bf0 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
25c00 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
25c10 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
25c20 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
25c30 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
25c40 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
25c50 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
25c60 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
25c70 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
25c80 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
25c90 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
25ca0 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
25cb0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
25cc0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
25cd0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
25ce0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
25cf0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
25d00 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
25d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25d20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
25d30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
25d40 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
25d50 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
25d60 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
25d70 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
25d80 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
25d90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
25da0 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
25db0 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
25dc0 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
25dd0 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
25de0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
25df0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
25e00 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
25e10 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
25e20 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
25e30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25e40 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
25e50 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
25e60 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
25e70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
25e80 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
25e90 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
25ea0 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
25eb0 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
25ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
25ed0 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
25ee0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
25ef0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
25f00 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
25f10 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
25f20 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
25f30 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
25f40 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
25f50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
25f60 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
25f70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
25f80 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
25f90 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
25fa0 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
25fb0 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
25fc0 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
25fd0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
25fe0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
25ff0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
26000 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
26010 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
26020 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
26030 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
26040 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
26050 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
26060 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
26070 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
26080 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
26090 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
260a0 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
260b0 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
260c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
260d0 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
260e0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
260f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
26100 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
26110 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
26120 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
26130 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
26140 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
26150 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
26160 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
26170 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
26180 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
26190 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
261a0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
261b0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
261c0 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
261d0 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
261e0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
261f0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
26200 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
26210 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
26220 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
26230 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
26240 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
26250 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
26260 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
26270 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
26280 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
26290 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
262a0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
262b0 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
262c0 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
262d0 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
262e0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
262f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
26300 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
26310 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
26320 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
26330 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
26340 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
26370 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
26380 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
26390 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
263a0 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
263b0 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
263c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
263d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
263e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
263f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
26400 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
26410 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
26420 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
26430 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
26440 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
26450 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
26460 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
26470 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
26480 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
26490 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
264a0 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
264b0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
264c0 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
264d0 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
264e0 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
264f0 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
26500 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
26510 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
26520 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
26530 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
26540 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
26550 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
26560 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
26570 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
26580 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
26590 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
265a0 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
265b0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
265c0 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
265d0 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
265e0 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
265f0 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
26600 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
26610 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
26620 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
26630 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
26640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26650 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
26660 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
26670 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ze ){.    sqlite
26680 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
26690 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
266a0 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
266b0 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
266c0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
266d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
266e0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
266f0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
26700 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
26710 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
26720 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
26730 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
26740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26750 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
26760 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
26770 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
26780 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
26790 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
267a0 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
267b0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
267c0 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
267d0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
267e0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
267f0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
26800 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
26810 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
26820 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
26830 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
26840 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
26850 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
26860 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
26870 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
26880 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
26890 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
268a0 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
268b0 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
268c0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
268d0 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
268e0 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
268f0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
26900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26910 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
26920 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
26930 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
26940 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
26950 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
26960 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
26970 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
26980 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
26990 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
269a0 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
269b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
269d0 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
269e0 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
269f0 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
26a00 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
26a10 4e 43 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  NC)==0 );..     
26a20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
26a30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
26a40 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
26a50 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
26a60 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
26a70 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
26a80 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
26a90 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
26aa0 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
26ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
26ac0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
26ad0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
26ae0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
26af0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
26b00 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
26b10 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
26b20 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
26b30 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
26b40 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
26b50 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
26b60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
26b70 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
26b80 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
26b90 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
26ba0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
26bb0 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
26bc0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
26bd0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
26be0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
26bf0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
26c00 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
26c10 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
26c20 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
26c30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
26c40 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
26c50 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
26c60 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
26c70 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
26c80 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
26c90 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
26ca0 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
26cb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
26cc0 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
26cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
26ce0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
26cf0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
26d00 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
26d10 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
26d20 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
26d30 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
26d40 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
26d50 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
26d60 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
26d70 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
26d80 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
26d90 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
26da0 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
26db0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
26dc0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
26dd0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
26de0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
26df0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
26e00 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
26e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
26e20 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
26e30 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
26e40 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26e50 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
26e60 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
26e70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
26e80 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
26e90 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
26ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26eb0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
26ec0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
26ed0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
26ee0 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
26ef0 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
26f00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26f10 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
26f20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26f30 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
26f40 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
26f50 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
26f60 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
26f70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26f80 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
26f90 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
26fa0 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
26fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
26fc0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
26fd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26ff0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
27000 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
27010 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27020 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
27030 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
27040 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
27050 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
27060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
27070 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
27080 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
27090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
270a0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
270b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
270c0 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
270d0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
270e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
270f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
27100 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
27110 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
27120 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
27130 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
27140 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
27150 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
27160 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
27170 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
27180 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
27190 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
271a0 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
271b0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
271c0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
271d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
271e0 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
271f0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
27200 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
27210 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
27220 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
27230 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
27240 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27250 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
27260 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
27270 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
27280 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
27290 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
272a0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
272b0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
272c0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
272d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
272e0 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
272f0 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
27300 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
27310 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
27320 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
27330 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
27340 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
27350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27360 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27370 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
27380 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
27390 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
273a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
273b0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
273c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
273d0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
273e0 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
273f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
27400 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
27410 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
27420 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27430 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
27440 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27450 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
27460 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
27470 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
27480 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
27490 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
274a0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
274b0 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
274c0 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
274d0 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
274e0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
274f0 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
27500 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
27510 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
27520 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
27530 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
27540 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
27550 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
27560 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
27570 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
27580 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
27590 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
275a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
275b0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
275c0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
275d0 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
275e0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
275f0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
27600 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
27610 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
27620 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
27630 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
27640 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
27650 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27660 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
27670 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
27680 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
27690 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
276a0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
276b0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
276c0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
276d0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
276e0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
276f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
27700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27720 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
27730 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
27740 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27750 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
27760 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
27770 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27780 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
27790 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
277a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
277b0 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
277c0 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
277d0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
277e0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
277f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27800 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
27810 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
27820 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
27830 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
27840 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
27850 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
27860 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
27870 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
27880 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
27890 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
278a0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
278b0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
278c0 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
278d0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
278e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
278f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
27900 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
27910 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
27920 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
27930 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
27940 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
27950 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
27960 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
27970 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
27980 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
27990 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
279a0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
279b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
279c0 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
279d0 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
279e0 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
279f0 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
27a00 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
27a10 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
27a20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
27a30 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
27a40 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
27a50 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
27a60 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
27a70 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
27a80 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
27a90 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
27aa0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
27ab0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
27ac0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
27ad0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
27ae0 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
27af0 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
27b00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27b10 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
27b20 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
27b30 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
27b40 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
27b50 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
27b60 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
27b70 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
27b80 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
27b90 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
27ba0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
27bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27bc0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
27bd0 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
27be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27bf0 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
27c00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27c10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
27c20 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
27c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27c40 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
27c50 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
27c60 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
27c70 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
27c80 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
27c90 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
27ca0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
27cb0 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
27cc0 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
27cd0 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
27ce0 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
27cf0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
27d00 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
27d10 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
27d20 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
27d30 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
27d40 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
27d50 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
27d60 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
27d70 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
27d80 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
27d90 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
27da0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
27db0 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
27dc0 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
27dd0 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
27de0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
27df0 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
27e00 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
27e10 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
27e20 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
27e30 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
27e40 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
27e50 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
27e60 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
27e70 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  aton it .  ** is
27e80 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
27e90 73 71 6c 69 74 65 33 50 43 61 63 68 65 46 65 74  sqlite3PCacheFet
27ea0 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
27eb0 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
27ec0 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==1.  ** while 
27ed0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
27ee0 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
27ef0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
27f00 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
27f10 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
27f20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
27f30 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
27f40 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
27f50 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
27f60 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
27f70 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
27f80 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
27f90 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
27fa0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
27fb0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
27fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27fd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
27fe0 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75  oNotSpill ) retu
27ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28000 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
28010 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70  tSyncSpill && (p
28020 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
28030 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
28040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
28060 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
28070 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
28080 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
28090 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
280a0 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
280b0 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
280c0 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  og. */.    if( s
280d0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
280e0 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72  pPg) ){ .      r
280f0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
28100 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a  ge(pPg); .    }.
28110 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
28130 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
28140 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
28150 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
28160 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
28170 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
28180 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
28190 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
281a0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
281b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
281c0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
281d0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
281e0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
281f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
28200 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
28210 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
28220 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
28230 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
28240 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
28250 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
28260 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
28270 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
28280 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
28290 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
282a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
282b0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
282c0 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
282d0 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
282e0 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
282f0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
28300 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
28310 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
28320 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
28330 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
28340 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
28350 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
28360 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
28370 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
28380 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
28390 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
283a0 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
283b0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
283c0 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
283d0 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
283e0 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
283f0 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
28400 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
28410 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
28420 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
28430 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
28440 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
28450 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
28460 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
28470 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
28480 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
28490 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
284a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
284b0 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
284c0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
284d0 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
284e0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
284f0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
28500 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
28510 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
28520 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
28530 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
28540 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
28550 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
28560 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
28570 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
28580 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
28590 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
285a0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
285b0 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
285c0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
285d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
285e0 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
285f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
28600 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
28610 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
28620 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
28630 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
28640 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
28650 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
28660 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
28670 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
28680 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
28690 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
286a0 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
286b0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
286c0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
286d0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
286e0 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
286f0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
28700 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
28710 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
28720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28730 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
28740 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
28750 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
28760 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
28770 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
28780 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
28790 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
287a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
287b0 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
287c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
287d0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
287e0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
287f0 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
28800 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
28810 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
28820 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
28830 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
28840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
28850 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
28860 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
28870 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28880 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
28890 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
288a0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
288b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
288c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
288d0 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  , rc); .}.../*.*
288e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
288f0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
28900 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
28910 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
28920 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
28930 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
28940 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
28950 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
28960 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
28970 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
28980 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
28990 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
289a0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
289b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
289c0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
289d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
289e0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
289f0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
28a00 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
28a10 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
28a20 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
28a30 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
28a40 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
28a50 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
28a60 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
28a70 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
28a80 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
28a90 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
28aa0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
28ab0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
28ac0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
28ad0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
28ae0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
28af0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
28b00 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
28b10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
28b20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
28b30 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
28b40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28b50 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
28b60 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
28b70 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
28b80 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
28b90 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
28ba0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
28bb0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
28bc0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
28bd0 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
28be0 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
28bf0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
28c00 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
28c10 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
28c20 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
28c30 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
28c40 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
28c50 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
28c60 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
28c70 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
28c80 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
28c90 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a  DLOCK flags..**.
28ca0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
28cb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
28cc0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
28cd0 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
28ce0 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
28cf0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
28d00 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
28d10 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
28d20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
28d30 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
28d40 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
28d50 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
28d60 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
28d70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
28d80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
28d90 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
28da0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
28db0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
28dc0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
28dd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
28de0 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
28df0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
28e00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
28e10 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
28e20 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
28e30 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
28e40 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
28e50 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
28e60 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
28e70 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
28e80 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
28e90 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
28ea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
28eb0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
28ec0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
28ed0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
28ee0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
28ef0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
28f00 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
28f10 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
28f20 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
28f30 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
28f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
28f50 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
28f60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28f70 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
28f80 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
28f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28fa0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
28fb0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
28fc0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
28fd0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
28fe0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
28ff0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
29000 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
29010 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
29020 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
29030 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
29040 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
29050 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
29060 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
29070 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
29080 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
29090 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
290a0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
290b0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
290c0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
290d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
290e0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
290f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
29100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29110 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
29120 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
29130 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
29140 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
29150 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
29160 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
29170 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
29180 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
29190 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
291a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
291b0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
291c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
291d0 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
291e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
291f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
29200 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
29210 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
29220 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
29230 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
29240 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
29250 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
29260 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
29270 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
29280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29290 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
292a0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
292b0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
292c0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
292d0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
292e0 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
292f0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
29300 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
29310 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
29320 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a  EADLOCK)!=0;  /*
29330 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65   True to omit re
29340 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ad-lock */.  int
29350 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
29360 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
29370 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
29380 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
29390 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
293a0 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
293b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
293c0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
293d0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
293e0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
293f0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
29400 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
29410 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
29420 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
29430 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
29440 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
29450 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
29460 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
29470 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
29480 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
29490 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
294a0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
294b0 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
294c0 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
294d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
294e0 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
294f0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
29500 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
29510 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
29520 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
29530 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
29540 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
29550 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
29560 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
29570 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
29580 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
29590 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
295a0 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
295b0 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
295c0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
295d0 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
295e0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
295f0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
29600 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
29610 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
29620 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
29630 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
29640 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
29650 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
29660 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
29670 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
29680 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
29690 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
296a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
296b0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
296c0 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
296d0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
296e0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
296f0 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
29700 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
29710 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
29720 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
29730 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
29740 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
29750 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
29760 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
29770 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
29780 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
29790 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
297a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
297b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
297c0 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
297d0 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
297e0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
297f0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
29800 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
29810 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
29820 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
29830 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
29840 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
29850 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
29860 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
29870 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
29880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29890 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
298a0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
298b0 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
298c0 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
298d0 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
298e0 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
298f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29900 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
29910 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
29920 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
29930 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
29940 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
29950 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
29960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
29970 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
29980 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
29990 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
299a0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
299b0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
299c0 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
299d0 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
299e0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
299f0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
29a00 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
29a10 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29a20 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
29a30 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
29a40 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
29a50 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
29a60 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
29a70 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
29a80 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
29a90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
29aa0 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
29ab0 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
29ac0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
29ad0 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
29ae0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29af0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
29b00 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
29b10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29b20 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
29b30 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
29b40 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29b50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
29b60 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
29b70 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
29b80 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
29b90 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
29ba0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
29bb0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
29bc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29bd0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
29be0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
29bf0 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
29c00 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
29c10 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
29c20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
29c30 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
29c40 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
29c50 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
29c60 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
29c70 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
29c80 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
29c90 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
29ca0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
29cb0 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
29cd0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
29ce0 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
29cf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
29d00 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
29d10 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
29d20 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
29d30 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
29d40 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
29d50 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
29d60 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
29d70 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
29d90 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
29da0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
29db0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
29dc0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
29dd0 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
29de0 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
29df0 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
29e00 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
29e10 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
29e20 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
29e30 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
29e40 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
29e50 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
29e60 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
29e70 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
29e80 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
29e90 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
29ea0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
29eb0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
29ec0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
29ed0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
29ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
29ef0 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
29f00 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
29f10 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
29f20 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
29f30 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20  me + 8 + 1      
29f40 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
29f50 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
29f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
29f70 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
29f80 20 34 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   4 + 1          
29f90 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
29fa0 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
29fb0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
29fc0 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
29fd0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
29fe0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
29ff0 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2a000 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a010 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2a020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2a030 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2a040 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2a050 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2a060 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2a070 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2a080 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2a090 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2a0a0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2a0b0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2a0c0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2a0d0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2a0e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2a0f0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2a100 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2a110 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2a120 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2a130 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2a140 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2a150 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2a160 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2a170 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2a180 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2a190 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2a1a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2a1b0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2a1c0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2a1d0 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2a1e0 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2a1f0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2a200 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2a210 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2a220 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70  athname ){.    p
2a230 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2a240 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2a250 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2a260 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1);.    memcpy(p
2a270 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2a280 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a290 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2a2a0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2a2b0 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2a2c0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2a2d0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2a2e0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2a2f0 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
2a300 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 8);.    if( pP
2a310 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2a320 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0]==0 ){.      p
2a330 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2a340 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  0] = 0;.    }.#i
2a350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a360 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73 65 7b 0a  T_WAL.    else{.
2a370 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57        pPager->zW
2a380 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2a390 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2a3a0 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  +8+1];.      mem
2a3b0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2a3c0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a3d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
2a3e0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2a3f0 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
2a400 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "-wal", 4);.    
2a410 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
2a420 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2a430 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2a440 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2a450 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2a460 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2a470 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2a480 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2a490 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2a4a0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2a4b0 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  && !memDb ){.   
2a4c0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4e0 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2a4f0 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2a500 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2a510 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2a520 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2a530 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2a540 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2a550 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  t);.    readOnly
2a560 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2a570 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2a580 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2a590 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2a5a0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2a5b0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2a5c0 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2a5d0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2a5e0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2a5f0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2a600 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2a610 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2a620 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2a630 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2a640 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2a650 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2a660 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2a670 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2a680 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2a690 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2a6a0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2a6b0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2a6c0 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2a6d0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2a6e0 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2a6f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a700 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2a710 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2a720 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2a730 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a740 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2a750 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2a760 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a770 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2a780 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2a790 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2a7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2a7b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2a7c0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2a7d0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2a7e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2a7f0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2a800 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a810 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2a820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a830 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2a840 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2a850 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2a860 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2a870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2a880 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2a890 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2a8a0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2a8b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2a8c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2a8d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2a8e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a8f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2a900 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2a910 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2a920 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2a930 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2a940 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2a950 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2a960 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a970 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2a980 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2a990 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2a9a0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2a9b0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2a9c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a9d0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2a9e0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2a9f0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2aa00 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2aa10 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2aa20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2aa30 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2aa40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2aa50 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2aa60 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2aa70 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2aa80 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2aa90 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2aaa0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2aab0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2aac0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2aad0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2aae0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2aaf0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2ab00 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2ab10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2ab20 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2ab30 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2ab40 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2ab50 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2ab60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2ab70 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2ab80 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2ab90 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2aba0 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2abb0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2abc0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2abd0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2abe0 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2abf0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2ac00 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2ac10 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2ac20 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2ac30 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2ac40 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2ac50 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2ac60 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2ac70 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2ac80 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2ac90 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2aca0 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2acb0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2acc0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2acd0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2ace0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2acf0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2ad00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad10 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2ad20 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2ad30 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2ad40 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2ad50 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2ad60 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2ad70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2ad80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2ad90 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2ada0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2adb0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2adc0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2add0 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2ade0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2adf0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2ae00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2ae10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ae20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2ae30 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2ae40 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2ae50 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2ae60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ae70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2ae80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2ae90 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2aea0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2aeb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2aec0 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2aed0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2aee0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2aef0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2af00 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2af10 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2af20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2af30 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2af40 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2af50 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2af60 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2af70 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2af80 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2af90 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2afa0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2afb0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2afc0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2afd0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2afe0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2aff0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2b000 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2b010 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
2b020 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
2b030 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
2b040 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
2b050 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2b060 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2b070 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2b080 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2b090 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2b0a0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2b0b0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2b0c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2b0d0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2b0e0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2b0f0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2b100 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2b110 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2b120 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2b130 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2b140 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2b150 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2b160 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2b170 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2b180 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2b190 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2b1a0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2b1b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2b1c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2b1d0 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2b1e0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2b1f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b200 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2b210 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2b220 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2b230 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2b240 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2b250 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2b260 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2b270 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2b280 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2b290 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2b2a0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2b2b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2b2c0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2b2d0 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2b2e0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2b2f0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2b300 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2b310 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2b320 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2b330 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2b340 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2b350 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2b360 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2b370 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2b380 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
2b390 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2b3a0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
2b3b0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2b3c0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2b3d0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2b3e0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2b3f0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2b400 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2b410 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2b420 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2b430 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2b440 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2b450 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2b460 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2b470 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2b480 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2b490 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2b4a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2b4b0 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2b4c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b4d0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2b4e0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2b4f0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2b500 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2b510 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2b520 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b530 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2b540 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2b550 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2b560 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2b570 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2b580 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2b590 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2b5a0 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2b5b0 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2b5c0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2b5d0 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
2b5e0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2b5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b600 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
2b610 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2b620 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2b630 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2b640 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2b650 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2b660 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2b670 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2b680 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2b690 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2b6a0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2b6b0 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2b6c0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2b6d0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2b6e0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2b6f0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2b700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2b710 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2b720 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2b730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2b740 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2b750 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2b760 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2b770 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2b780 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2b790 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2b7a0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2b7b0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2b7c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b7d0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2b7e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b7f0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2b800 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2b810 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2b820 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2b830 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2b840 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2b850 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2b860 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2b870 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2b880 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2b890 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2b8a0 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2b8b0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2b8c0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2b8d0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2b8e0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2b8f0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2b900 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2b910 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2b920 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2b930 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2b940 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2b950 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2b960 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2b970 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2b980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2b990 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2b9a0 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2b9b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2b9c0 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2b9d0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2b9e0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2b9f0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2ba00 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2ba10 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2ba20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ba30 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2ba40 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2ba50 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2ba60 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2ba70 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2ba80 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2ba90 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2baa0 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2bab0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2bac0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2bad0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2bae0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2baf0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2bb00 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2bb10 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2bb20 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2bb30 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2bb40 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2bb50 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2bb60 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2bb70 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2bb80 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2bb90 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2bba0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2bbb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2bbc0 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2bbd0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2bbe0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2bbf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2bc00 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2bc10 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2bc20 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2bc30 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2bc40 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2bc50 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2bc60 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2bc70 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2bc80 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2bc90 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2bca0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2bcb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2bcc0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bcd0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2bce0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2bcf0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2bd00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2bd10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2bd20 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2bd30 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2bd40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2bd50 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2bd60 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2bd70 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2bd80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2bd90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2bda0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2bdb0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2bdc0 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2bdd0 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2bde0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2bdf0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2be00 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2be10 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2be20 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2be30 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2be40 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2be50 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2be60 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2be70 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2be80 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2be90 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2bea0 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2beb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bec0 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2bed0 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2bee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2bef0 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2bf00 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2bf10 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2bf20 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2bf30 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2bf40 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2bf50 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2bf60 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2bf70 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2bf80 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2bf90 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2bfa0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2bfb0 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2bfc0 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2bfd0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2bfe0 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2bff0 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2c000 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2c010 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2c020 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2c030 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2c040 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2c050 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2c060 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2c070 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2c080 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2c090 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2c0a0 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2c0b0 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2c0c0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2c0d0 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2c0e0 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2c0f0 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2c100 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2c110 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2c120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c130 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2c140 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2c150 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2c160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c170 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2c180 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c1a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c1b0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2c1c0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
2c1d0 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
2c1e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c1f0 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
2c200 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
2c210 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
2c220 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2c230 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
2c240 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
2c250 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
2c260 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
2c270 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
2c280 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
2c290 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
2c2a0 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
2c2b0 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
2c2c0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
2c2d0 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
2c2e0 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
2c2f0 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
2c300 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2c310 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2c320 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2c330 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c350 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
2c360 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c370 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2c380 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2c390 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2c3a0 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2c3b0 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2c3c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c3d0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2c3e0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2c3f0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2c400 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 55            pagerU
2c410 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2c420 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2c430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c440 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2c450 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2c460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2c480 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2c490 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2c4a0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2c4b0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2c4c0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2c4d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2c4e0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2c4f0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2c500 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2c510 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2c520 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2c530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2c540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2c550 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2c560 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2c570 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2c580 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2c590 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2c5a0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2c5b0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2c5c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c5d0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2c5e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2c5f0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2c600 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2c610 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2c620 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2c630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c640 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2c650 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2c660 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2c670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c680 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2c690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c6a0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2c6b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2c6c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c6d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2c6e0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2c6f0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2c700 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c710 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2c720 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2c730 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c740 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2c750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c760 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2c770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c780 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2c790 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2c7a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c7b0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2c7c0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2c7d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c7e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2c7f0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2c800 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2c810 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2c820 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2c830 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2c840 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2c850 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2c860 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2c870 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2c880 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2c890 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2c8a0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2c8b0 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2c8c0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2c8d0 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2c8f0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2c900 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2c910 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2c920 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2c930 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2c940 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2c950 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2c960 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2c970 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2c980 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2c990 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2c9a0 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2c9b0 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2c9c0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2c9d0 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2c9e0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2c9f0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2ca00 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2ca10 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2ca20 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2ca30 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2ca40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2ca50 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2ca60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ca70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ca80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ca90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2caa0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2cab0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2cac0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2cad0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2cae0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2caf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2cb00 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2cb10 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2cb20 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2cb30 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2cb40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2cb50 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2cb60 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2cb70 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2cb80 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2cb90 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2cba0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2cbb0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2cbc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2cbd0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2cbe0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2cbf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2cc00 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2cc10 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2cc20 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2cc30 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2cc40 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2cc50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cc60 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2cc70 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2cc80 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2cc90 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2cca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ccb0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2ccc0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2ccd0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2cce0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2ccf0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2cd00 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2cd10 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2cd20 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2cd30 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2cd40 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2cd50 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2cd60 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2cd70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2cd80 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2cd90 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2cda0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2cdb0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2cdc0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2cdd0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2cde0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2cdf0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2ce00 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2ce10 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2ce20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2ce30 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2ce40 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2ce50 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2ce60 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2ce70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2ce80 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2ce90 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2cea0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2ceb0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2cec0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2ced0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2cee0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2cef0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2cf00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2cf10 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2cf20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2cf30 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2cf40 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2cf50 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2cf60 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2cf70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2cf80 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2cf90 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2cfa0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2cfb0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2cfc0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2cfd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2cfe0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2cff0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2d000 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2d010 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2d020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2d030 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2d040 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d060 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2d070 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d080 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2d090 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2d0a0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2d0b0 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2d0c0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2d0d0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2d0e0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2d0f0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2d100 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2d110 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2d120 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2d130 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2d140 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2d150 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2d160 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2d170 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2d180 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d190 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2d1a0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d1b0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2d1c0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2d1d0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2d1e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2d1f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2d200 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2d210 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2d220 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2d230 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2d240 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2d250 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2d260 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2d270 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2d280 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2d290 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2d2a0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2d2b0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2d2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d2d0 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2d2e0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2d2f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2d300 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2d310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d320 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2d330 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64   || pPager->read
2d340 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28  Only );..    if(
2d350 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2d360 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
2d370 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2d380 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2d390 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2d3a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d3b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d3d0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2d3e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2d3f0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2d400 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2d410 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2d420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2d430 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2d440 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2d450 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2d460 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2d470 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2d480 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2d490 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2d4a0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2d4b0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2d4c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2d4d0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2d4e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2d4f0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2d500 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2d510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d530 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2d540 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2d550 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2d560 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
2d570 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2d580 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2d590 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
2d5a0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
2d5b0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
2d5c0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2d5d0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
2d5e0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
2d5f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
2d600 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2d610 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
2d620 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
2d630 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
2d640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2d650 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
2d660 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
2d670 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
2d680 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2d690 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
2d6a0 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
2d6b0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
2d6c0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
2d6d0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
2d6e0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
2d6f0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
2d700 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2d710 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2d720 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
2d730 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
2d740 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
2d750 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
2d760 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2d770 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
2d780 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
2d790 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
2d7a0 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
2d7b0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
2d7c0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
2d7d0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
2d7e0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
2d7f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
2d800 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
2d810 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2d820 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
2d830 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
2d840 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
2d850 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
2d860 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2d870 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
2d880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2d890 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
2d8a0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
2d8b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2d8c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d8d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
2d8e0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2d8f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
2d900 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2d910 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
2d920 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
2d930 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
2d940 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
2d950 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2d960 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
2d970 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
2d980 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
2d990 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2d9a0 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
2d9b0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2d9c0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
2d9d0 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
2d9e0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
2d9f0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
2da00 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
2da10 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
2da20 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
2da30 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
2da40 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
2da50 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
2da60 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
2da70 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
2da80 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
2da90 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
2daa0 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
2dab0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2dac0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
2dad0 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
2dae0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
2daf0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
2db00 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2db10 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
2db20 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
2db30 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
2db40 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
2db50 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
2db60 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2db70 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
2db80 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
2db90 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
2dba0 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
2dbb0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
2dbc0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
2dbd0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2dbe0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2dbf0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2dc00 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2dc10 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2dc20 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2dc30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2dc40 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2dc50 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2dc60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
2dc70 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
2dc80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2dc90 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2dca0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
2dcb0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2dcc0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
2dcd0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2dce0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2dcf0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
2dd00 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
2dd10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dd20 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
2dd30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2dd40 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2dd50 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2dd60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2dd70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2dd80 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2dd90 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2dda0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ddc0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2ddd0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2dde0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2ddf0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
2de00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2de10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2de20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2de30 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
2de40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2de50 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
2de60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2de70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2de80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2de90 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
2dea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2deb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2dec0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
2ded0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dee0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
2def0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
2df00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
2df10 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
2df20 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
2df30 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
2df40 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
2df50 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
2df60 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
2df70 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
2df80 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
2df90 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
2dfa0 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
2dfb0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
2dfc0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
2dfd0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
2dfe0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2dff0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
2e000 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
2e010 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
2e020 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
2e030 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
2e040 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
2e050 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
2e060 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
2e070 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
2e080 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
2e090 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
2e0a0 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
2e0b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
2e0c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e0d0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
2e0e0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2e0f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2e100 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
2e110 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2e120 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2e130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e140 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2e150 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e160 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
2e170 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2e180 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
2e190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e1a0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
2e1b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2e1c0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
2e1d0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2e1e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2e1f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2e200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e210 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2e220 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2e230 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
2e240 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2e250 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
2e260 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
2e270 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
2e280 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
2e290 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2e2a0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2e2b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2e2c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
2e2d0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
2e2e0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
2e2f0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
2e300 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
2e310 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
2e320 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
2e330 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
2e340 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
2e350 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
2e360 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
2e370 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
2e380 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
2e390 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
2e3a0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
2e3b0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
2e3c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2e3d0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
2e3e0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
2e3f0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
2e400 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
2e410 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
2e420 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
2e430 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
2e440 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
2e450 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
2e460 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
2e470 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
2e480 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
2e490 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
2e4a0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
2e4b0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2e4c0 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
2e4d0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
2e4e0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
2e4f0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
2e500 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
2e510 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
2e520 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
2e530 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
2e540 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
2e550 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
2e560 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
2e570 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
2e580 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
2e590 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
2e5a0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
2e5b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
2e5c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
2e5d0 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
2e5e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
2e5f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2e600 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
2e610 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2e620 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2e630 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2e640 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2e650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2e660 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
2e670 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2e680 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
2e690 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2e6a0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
2e6b0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
2e6c0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
2e6d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
2e6e0 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26  empFile .     &&
2e6f0 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   (pPager->pBacku
2e700 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
2e710 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2e720 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20  er->pPCache)>0) 
2e730 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2e740 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
2e750 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
2e760 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
2e770 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
2e780 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
2e790 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
2e7a0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
2e7b0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
2e7c0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
2e7d0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2e7e0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
2e7f0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
2e800 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
2e810 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
2e820 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2e830 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
2e840 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
2e850 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
2e860 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
2e870 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
2e880 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
2e890 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
2e8a0 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
2e8b0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
2e8c0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
2e8d0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
2e8e0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
2e8f0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
2e900 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
2e910 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
2e920 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
2e930 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
2e940 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
2e950 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
2e960 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
2e970 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
2e980 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
2e990 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2e9a0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
2e9b0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
2e9c0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
2e9d0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
2e9e0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
2e9f0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
2ea00 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
2ea10 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
2ea20 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
2ea30 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
2ea40 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
2ea50 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2ea60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
2ea70 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
2ea80 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2ea90 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
2eaa0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2eab0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2eac0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2ead0 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
2eae0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
2eaf0 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
2eb00 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
2eb10 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2eb20 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
2eb30 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
2eb40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2eb50 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
2eb60 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
2eb70 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
2eb80 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
2eb90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2eba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2ebb0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2ebc0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2ebd0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2ebe0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
2ebf0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2ec00 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
2ec10 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
2ec20 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2ec30 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
2ec40 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
2ec50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2ec60 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
2ec70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2ec80 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2ec90 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
2eca0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
2ecb0 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
2ecc0 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
2ecd0 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
2ece0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
2ecf0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
2ed00 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2ed10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2ed20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
2ed30 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  esent(pPager);. 
2ed40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ed50 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
2ed60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2ed70 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
2ed80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2ed90 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
2eda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2edb0 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
2edc0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
2edd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2ede0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
2edf0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2ee00 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2ee10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2ee20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2ee30 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
2ee40 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
2ee50 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
2ee60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2ee70 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
2ee80 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
2ee90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
2eea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2eeb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
2eec0 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
2eed0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2eee0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2eef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ef00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
2ef10 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
2ef20 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
2ef30 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
2ef40 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
2ef50 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
2ef60 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
2ef70 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
2ef80 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
2ef90 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
2efa0 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
2efb0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
2efc0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
2efd0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
2efe0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
2eff0 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
2f000 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
2f010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
2f020 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
2f030 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
2f040 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
2f050 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
2f060 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
2f070 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2f080 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
2f090 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
2f0a0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
2f0b0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2f0c0 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
2f0d0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
2f0e0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
2f0f0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
2f100 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
2f110 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
2f120 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
2f130 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
2f140 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
2f150 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
2f160 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
2f170 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
2f180 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2f190 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2f1a0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
2f1b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
2f1c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
2f1d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
2f1e0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
2f1f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2f200 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
2f210 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
2f220 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2f230 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
2f240 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
2f250 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
2f260 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
2f270 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
2f280 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
2f290 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
2f2a0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
2f2b0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2f2c0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
2f2d0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
2f2e0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
2f2f0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
2f300 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
2f310 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
2f320 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
2f330 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
2f340 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
2f350 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
2f360 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
2f370 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
2f380 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2f390 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
2f3a0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
2f3b0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
2f3c0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
2f3d0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
2f3e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
2f3f0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
2f400 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
2f410 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
2f420 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
2f430 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
2f440 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
2f450 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
2f460 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
2f470 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
2f480 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
2f490 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
2f4a0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
2f4b0 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
2f4c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2f4d0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
2f4e0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
2f4f0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2f500 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
2f510 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
2f520 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
2f530 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
2f540 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
2f550 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
2f560 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
2f570 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
2f580 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
2f590 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
2f5a0 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
2f5b0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
2f5c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2f5d0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
2f5e0 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2f5f0 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
2f600 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
2f610 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
2f620 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
2f630 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
2f640 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
2f650 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
2f660 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
2f670 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
2f680 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
2f690 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
2f6a0 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
2f6b0 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
2f6c0 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
2f6d0 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
2f6e0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
2f6f0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
2f700 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2f710 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
2f720 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
2f730 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
2f740 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
2f750 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
2f760 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
2f770 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
2f780 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
2f790 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
2f7a0 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
2f7b0 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
2f7c0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2f7d0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
2f7e0 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
2f7f0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
2f800 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
2f810 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2f820 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
2f830 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
2f840 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
2f850 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
2f860 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
2f870 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
2f880 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
2f890 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
2f8a0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2f8b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2f8c0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2f8d0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
2f8e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2f8f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2f900 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
2f910 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
2f920 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
2f930 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
2f940 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
2f950 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
2f960 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
2f970 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
2f980 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
2f990 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
2f9a0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
2f9b0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
2f9c0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
2f9d0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
2f9e0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
2f9f0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
2fa00 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
2fa10 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
2fa20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
2fa30 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
2fa40 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
2fa50 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
2fa60 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
2fa70 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
2fa80 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
2fa90 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
2faa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
2fab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2fac0 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
2fad0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
2fae0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
2faf0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
2fb00 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
2fb10 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
2fb20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2fb30 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
2fb40 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
2fb50 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
2fb60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
2fb70 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
2fb80 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
2fb90 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
2fba0 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
2fbb0 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
2fbc0 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
2fbd0 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
2fbe0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2fbf0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
2fc00 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
2fc10 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2fc20 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2fc30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
2fc40 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2fc50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fc60 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
2fc70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2fc80 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2fc90 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
2fca0 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
2fcb0 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
2fcc0 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
2fcd0 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
2fce0 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
2fcf0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2fd00 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de!=SQLITE_OK ){
2fd10 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
2fd20 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
2fd30 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
2fd40 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2fd50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
2fd60 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65   pgno, 1, ppPage
2fd70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
2fd80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fd90 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2fda0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2fdb0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
2fdc0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
2fdd0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
2fde0 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
2fdf0 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
2fe00 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
2fe10 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2fe20 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
2fe30 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
2fe40 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
2fe50 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
2fe60 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
2fe70 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
2fe80 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
2fe90 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
2fea0 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
2feb0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
2fec0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2fed0 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
2fee0 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
2fef0 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
2ff00 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
2ff10 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
2ff20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
2ff30 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
2ff40 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
2ff50 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
2ff60 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
2ff70 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
2ff80 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
2ff90 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
2ffa0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
2ffb0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
2ffc0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
2ffd0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
2ffe0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
2fff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30000 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
30010 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
30020 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
30030 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
30040 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
30050 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
30060 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a  itialized.  */..
30070 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
30080 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
30090 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
300a0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
300b0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
300c0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
300d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
300e0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
300f0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
30100 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
30110 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
30120 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
30130 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
30140 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
30150 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
30160 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
30170 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
30180 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
30190 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
301a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
301b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
301c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
301d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
301e0 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
301f0 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
30200 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
30210 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
30220 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
30230 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
30240 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30250 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
30260 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
30270 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
30280 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
30290 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
302a0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
302b0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
302c0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
302d0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
302e0 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
302f0 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
30300 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
30310 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
30320 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
30330 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
30340 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
30350 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
30360 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
30370 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
30380 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
30390 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
303a0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
303b0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
303c0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
303d0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
303e0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
303f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
30400 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
30410 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
30420 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
30430 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
30440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
30450 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
30460 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
30470 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
30480 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
30490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
304a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
304b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
304c0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
304d0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
304e0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
304f0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
30500 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
30510 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
30520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30530 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
30540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30550 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
30560 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
30570 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
30580 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
30590 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
305a0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
305b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
305c0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
305d0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63  ager );.      rc
305e0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
305f0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
30600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30610 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
30620 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
30630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
30640 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
30650 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
30660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30670 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
30680 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
30690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
306a0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
306b0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
306c0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
306d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
306e0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
306f0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
30700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30710 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
30720 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
30730 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
30740 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
30750 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
30760 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
30770 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
30780 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
30790 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
307a0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
307b0 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
307c0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
307d0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
307e0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
307f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
30800 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
30810 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
30820 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
30830 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
30840 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
30850 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
30860 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
30870 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
30880 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
30890 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
308a0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
308b0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
308c0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
308d0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
308e0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
308f0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
30900 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
30910 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
30920 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
30930 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
30940 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
30950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30960 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
30970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30980 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
30990 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
309a0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
309b0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73  GER_ERROR );.  s
309c0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
309d0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
309e0 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
309f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
30a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
30a10 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
30a20 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
30a30 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
30a40 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
30a50 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
30a60 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
30a70 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
30a80 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
30a90 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
30aa0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
30ab0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
30ac0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
30ad0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
30ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
30af0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
30b00 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
30b10 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
30b20 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g){.  if( pPg ){
30b30 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
30b40 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
30b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
30b60 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
30b70 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
30b80 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
30b90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
30ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30bb0 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
30bc0 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
30bd0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
30be0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
30bf0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
30c00 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
30c10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30c20 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
30c30 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
30c40 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
30c50 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
30c60 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
30c70 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
30c80 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
30c90 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
30ca0 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
30cb0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
30cc0 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
30cd0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
30ce0 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
30cf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
30d00 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
30d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30d20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
30d30 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
30d40 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
30d50 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
30d60 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
30d70 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
30d80 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
30d90 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
30da0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
30db0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
30dc0 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
30dd0 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
30de0 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
30df0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30e00 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
30e10 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
30e20 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
30e30 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
30e40 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
30e50 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
30e60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30e70 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
30e80 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
30e90 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
30ea0 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
30eb0 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
30ec0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
30ed0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
30ee0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
30ef0 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
30f00 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
30f10 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
30f20 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
30f30 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
30f40 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
30f50 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
30f60 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
30f70 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
30f80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
30f90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
30fa0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
30fb0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
30fc0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
30fd0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
30fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ff0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
31000 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
31010 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
31020 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
31030 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
31040 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
31050 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
31060 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31070 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
31080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
31090 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
310a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
310b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
310c0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
310d0 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
310e0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
310f0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
31100 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
31110 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
31120 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
31130 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
31140 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
31150 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
31160 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
31170 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
31180 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
31190 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
311a0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
311b0 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
311c0 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
311d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
311e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
311f0 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
31200 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
31210 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
31220 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
31230 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
31240 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
31250 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
31260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
31270 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  EM;.    }.  .   
31280 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
31290 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
312a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
312b0 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
312c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
312d0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
312e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
312f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
31300 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
31310 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31320 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
31330 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
31340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31350 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
31360 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
31370 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
31380 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
31390 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
313a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
313b0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
313c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
313d0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
313e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
313f0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
31400 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
31410 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
31420 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
31430 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53  :.            (S
31440 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31450 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
31460 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53     );.  #ifdef S
31470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
31480 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
31490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
314a0 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
314b0 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
314c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
314d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
314e0 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
314f0 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20  e(pPager).      
31500 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20    );.  #else.   
31510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31520 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
31530 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31540 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
31550 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66  gs, 0);.  #endif
31560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
31570 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31580 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
31590 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
315a0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
315b0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
315c0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
315d0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
315e0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
315f0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
31600 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
31610 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
31620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31630 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
31640 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
31650 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
31660 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
31670 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
31680 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
31690 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
316a0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
316b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
316c0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
316d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
316e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
316f0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
31700 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
31710 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
31720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
31730 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
31740 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
31750 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
31760 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
31770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
31780 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31790 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
317a0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
317b0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
317c0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
317d0 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
317e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
317f0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
31800 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
31810 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
31820 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
31830 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
31840 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
31850 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
31860 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
31870 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
31880 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
31890 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
318a0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
318b0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
318c0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
318d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
318e0 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
318f0 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
31900 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
31910 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31920 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
31930 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
31940 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
31950 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
31960 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
31970 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
31980 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
31990 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
319a0 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
319b0 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
319c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
319d0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
319e0 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
319f0 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
31a00 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
31a10 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
31a20 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
31a30 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
31a40 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
31a50 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
31a60 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
31a70 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
31a80 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
31a90 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
31aa0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
31ab0 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
31ac0 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
31ad0 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
31ae0 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
31af0 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
31b00 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
31b10 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
31b20 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
31b30 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
31b40 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
31b50 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
31b60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
31b70 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
31b80 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
31b90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31ba0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
31bb0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
31bc0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
31bd0 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Code;.  assert( 
31be0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
31bf0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
31c00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
31c10 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
31c20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
31c30 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
31c40 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20  nMemory;..  if( 
31c50 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65  ALWAYS(pPager->e
31c60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
31c70 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65  DER) ){.    asse
31c80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
31c90 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  ournal==0 );..  
31ca0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
31cb0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
31cc0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
31cd0 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  er is configured
31ce0 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f   to use locking_
31cf0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20  mode=exclusive, 
31d00 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  and an.      ** 
31d10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
31d20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
31d30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
31d40 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f  ld, obtain it no
31d50 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
31d60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
31d70 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73  clusiveMode && s
31d80 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
31d90 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
31da0 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Wal, -1) ){.    
31db0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
31dc0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
31dd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
31de0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31e00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c    sqlite3WalExcl
31e30 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
31e40 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20  ->pWal, 1);.    
31e50 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72    }..      /* Gr
31e60 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ab the write loc
31e70 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  k on the log fil
31e80 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
31e90 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20  , upgrade to.   
31ea0 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45     ** PAGER_RESE
31eb0 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65  RVED state. Othe
31ec0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
31ed0 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
31ee0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
31ef0 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e   ** The busy-han
31f00 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f  dler is not invo
31f10 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63  ked if another c
31f20 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64  onnection alread
31f30 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73  y.      ** holds
31f40 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e   the write-lock.
31f50 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
31f60 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
31f70 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20  ll call it..    
31f80 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
31f90 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
31fa0 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
31fb0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
31fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31fd0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
31fe0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
31ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32000 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
32010 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
32020 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
32030 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
32040 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
32050 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
32060 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
32070 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
32080 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
32090 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
320a0 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
320b0 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
320c0 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
320d0 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
320e0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
320f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
32100 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
32110 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
32120 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32130 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20  TE_OK && exFlag 
32140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
32150 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
32160 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
32170 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
32180 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
32190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
321a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61   ){.      /* Cha
321b0 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f  nge to WRITER_LO
321c0 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20  CKED state..    
321d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41    **.      ** WA
321e0 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65  L mode sets Page
321f0 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45  r.eState to PAGE
32200 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
32210 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  or CACHEMOD.    
32220 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73    ** when it has
32230 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
32240 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20  tion, but never 
32250 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49  to DBMOD or FINI
32260 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54  SHED..      ** T
32270 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
32280 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74  n those states t
32290 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20  he code to roll 
322a0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a  back savepoint .
322b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
322c0 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64  tions may copy d
322d0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ata from the sub
322e0 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68  -journal into th
322f0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
32300 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c    ** file as wel
32310 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61  l as into the pa
32320 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20  ge cache. Which 
32330 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65  would be incorre
32340 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ct in .      ** 
32350 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  WAL mode..      
32360 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
32370 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
32380 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20  WRITER_LOCKED;. 
32390 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48       pPager->dbH
323a0 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
323b0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
323c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
323d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
323e0 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
323f0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
32400 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
32410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
32420 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
32430 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
32440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
32450 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
32460 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
32470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
32480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
32490 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
324a0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
324b0 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ED );.    assert
324c0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
324d0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
324e0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
324f0 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E(("TRANSACTION 
32500 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32510 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75  Pager)));.  retu
32520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32530 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
32540 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
32550 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
32560 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
32570 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
32580 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
32590 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
325a0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
325b0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
325c0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
325d0 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
325e0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
325f0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
32600 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
32610 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
32620 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
32630 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
32640 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
32650 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
32660 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
32670 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
32680 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
32690 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
326a0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
326b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
326c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
326d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
326e0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
326f0 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
32700 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
32710 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
32720 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
32730 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
32740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
32750 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
32760 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
32770 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
32780 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
32790 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
327a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
327b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
327c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
327d0 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
327e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
327f0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
32800 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
32810 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32820 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
32830 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
32840 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32850 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
32860 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
32870 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75  has been previou
32880 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72 65  sly detected, re
32890 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65 72  port the same er
328a0 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20  ror.  ** again. 
328b0 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  This should not 
328c0 68 61 70 70 65 6e 2c 20 62 75 74 20 74 68 65 20  happen, but the 
328d0 63 68 65 63 6b 20 70 72 6f 76 69 64 65 73 20 72  check provides r
328e0 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
328f0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
32900 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65  ->errCode) )  re
32910 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
32920 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68  Code;..  /* High
32930 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
32940 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69  s never call thi
32950 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61  s function if da
32960 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20  tabase is not.  
32970 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75  ** writable.  Bu
32980 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20  t check anyway, 
32990 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e  just for robustn
329a0 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
329b0 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64  VER(pPager->read
329c0 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53  Only) ) return S
329d0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43  QLITE_PERM;..  C
329e0 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
329f0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
32a00 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
32a10 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
32a20 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
32a30 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
32a40 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
32a50 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
32a60 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
32a70 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
32a80 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
32a90 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
32aa0 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
32ab0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
32ac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
32ad0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32ae0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
32af0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
32b00 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
32b10 43 48 45 4d 4f 44 20 29 3b 0a 20 20 7d 65 6c 73  CHEMOD );.  }els
32b20 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
32b30 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
32b40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
32b50 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
32b60 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
32b70 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
32b80 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
32b90 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
32ba0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
32bb0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
32bc0 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76 65 6c   ** Higher level
32bd0 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
32be0 6c 72 65 61 64 79 20 6f 62 74 61 69 6e 65 64 20  lready obtained 
32bf0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
32c00 63 6b 73 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  cks.    ** to be
32c10 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72  gin the write-tr
32c20 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74  ansaction, but t
32c30 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
32c40 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 0a 20  nal might not . 
32c50 20 20 20 2a 2a 20 79 65 74 20 62 65 20 6f 70 65     ** yet be ope
32c60 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69  n. Open it now i
32c70 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
32c80 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
32c90 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
32ca0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
32cb0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
32cc0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
32cd0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
32ce0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
32cf0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
32d00 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
32d10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32d20 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
32d30 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
32d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
32d50 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32d60 70 50 61 67 65 72 29 20 29 3b 0a 20 20 0a 20 20  pPager) );.  .  
32d70 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
32d80 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
32d90 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
32da0 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
32db0 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
32dc0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
32dd0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
32de0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
32df0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
32e00 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
32e10 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
32e20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
32e30 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
32e40 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
32e50 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
32e60 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
32e70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
32e80 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
32e90 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
32ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
32eb0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
32ec0 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f  bOrigSize && isO
32ed0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
32ef0 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
32f00 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20  har *pData2;.   
32f10 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20       i64 iOff = 
32f20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
32f30 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ff;..        /* 
32f40 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
32f50 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
32f60 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
32f70 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
32f80 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
32f90 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
32fa0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
32fb0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
32fc0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
32fd0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
32fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
32ff0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
33000 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
33010 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
33020 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
33030 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
33040 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
33050 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
33060 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
33070 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
33080 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
33090 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
330a0 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
330b0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
330c0 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20  Data2);..       
330d0 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
330e0 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
330f0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
33100 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
33110 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
33120 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
33130 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
33140 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
33150 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
33160 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33170 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
33180 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
33190 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
331a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
331b0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
331c0 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
331d0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
331e0 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
331f0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
33200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33210 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
33220 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
33230 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
33240 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
33250 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
33260 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
33270 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
33280 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
33290 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  C;..        rc =
332a0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
332b0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
332c0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
332d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
332e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
332f0 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
33300 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
33310 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
33320 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
33330 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
33340 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33350 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
33360 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
33370 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
33380 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
33390 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
333a0 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  e+4, cksum);.   
333b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
333c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
333d0 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54  rc;..        IOT
333e0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
333f0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
33400 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
33410 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
33420 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
33430 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
33440 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
33450 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
33460 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
33470 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
33480 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
33490 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
334a0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
334b0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
334c0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
334d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
334e0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
334f0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
33500 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
33510 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
33520 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
33530 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
33540 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38  >journalOff += 8
33550 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
33560 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
33570 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
33580 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
33590 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
335a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
335b0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
335c0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
335d0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
335e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
335f0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
33600 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
33610 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33620 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
33630 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
33640 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
33650 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
33660 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
33670 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
33680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
336a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
336b0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
336c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
336d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
336e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
336f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33700 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
33710 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
33720 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
33730 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
33740 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33750 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
33760 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
33770 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
33780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33790 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
337a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
337b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
337c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
337d0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
337e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
337f0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
33800 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
33810 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
33820 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
33830 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
33840 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
33850 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
33860 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
33870 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
33880 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
33890 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
338a0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
338b0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
338c0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
338d0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
338e0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
338f0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
33900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
33910 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
33920 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
33930 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
33940 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
33950 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
33960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
33970 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
33980 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
33990 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
339a0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
339b0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
339c0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
339d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
339e0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
339f0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
33a00 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
33a10 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
33a20 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
33a30 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
33a40 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
33a50 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
33a60 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
33a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
33a80 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
33a90 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
33aa0 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
33ab0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
33ac0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
33ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
33ae0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
33af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
33b00 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
33b10 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
33b20 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
33b30 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
33b40 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
33b50 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
33b60 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
33b70 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
33b80 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
33b90 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
33ba0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
33bb0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
33bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33bd0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
33be0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
33bf0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
33c00 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
33c10 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
33c20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
33c30 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
33c40 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
33c50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33c60 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
33c70 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
33c80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33c90 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
33ca0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
33cb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
33cc0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
33cd0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
33ce0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
33cf0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
33d00 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73  ageSize);..  ass
33d10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33d20 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
33d30 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
33d40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33d50 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
33d60 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
33d70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
33d80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
33d90 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
33da0 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
33db0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
33dc0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
33dd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
33de0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
33df0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
33e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e10 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
33e20 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
33e30 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
33e40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
33e50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33e60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
33e70 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
33e80 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
33e90 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33eb0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
33ec0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
33ed0 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
33ee0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
33ef0 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
33f00 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
33f10 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
33f20 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
33f30 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
33f40 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
33f50 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a  allow.    ** a j
33f60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
33f70 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
33f80 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
33f90 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a  urnaled by.    *
33fa0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  * this function.
33fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
33fc0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
33fd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33fe0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
33ff0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
34000 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
34010 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  l++;..    /* Thi
34020 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
34030 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
34040 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
34050 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
34060 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
34070 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
34080 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
34090 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
340a0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
340b0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
340c0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
340d0 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
340e0 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
340f0 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
34100 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
34110 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67  ) + 1;..    nPag
34120 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d  eCount = pPager-
34130 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  >dbSize;.    if(
34140 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
34150 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
34160 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
34170 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
34180 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
34190 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
341a0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
341b0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
341c0 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
341d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
341e0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
341f0 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
34200 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
34210 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
34220 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
34230 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
34240 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
34250 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
34260 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
34270 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
34280 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
34290 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
342a0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
342b0 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
342c0 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
342d0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
342e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
342f0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
34300 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
34310 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
34320 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
34330 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34340 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
34350 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
34360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34380 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
34390 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
343a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
343b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
343c0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
343d0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
343e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
343f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
34400 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34410 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
34420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
34430 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
34440 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
34450 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
34460 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
34470 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
34480 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
34490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
344a0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
344b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
344c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
344d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
344e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
344f0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
34500 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
34510 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
34520 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
34530 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
34540 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
34550 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
34560 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
34570 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
34580 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
34590 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
345a0 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
345b0 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
345c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
345d0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
345e0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
345f0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
34600 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
34610 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
34620 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
34630 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
34640 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
34650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
34660 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
34670 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
34680 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
34690 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b  0; ii<nPage; ii+
346a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
346b0 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
346c0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
346d0 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
346e0 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
346f0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66          pPage->f
34700 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
34710 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
34720 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
34730 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
34740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34750 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
34760 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
34770 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20  yncSpill==1 );. 
34780 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
34790 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d  SyncSpill--;.  }
347a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
347b0 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
347c0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
347d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
347e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
347f0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
34800 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
34810 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
34820 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
34830 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
34840 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
34850 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
34860 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
34870 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
34880 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
34890 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
348a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
348b0 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
348c0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
348d0 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
348e0 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
348f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
34900 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
34910 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
34920 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
34930 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
34940 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
34950 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
34960 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
34970 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
34980 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
34990 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
349a0 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
349b0 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
349c0 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
349d0 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
349e0 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
349f0 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
34a00 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
34a10 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
34a20 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
34a30 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
34a40 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
34a50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
34a60 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
34a70 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
34a80 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
34a90 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
34aa0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
34ab0 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
34ac0 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
34ad0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
34ae0 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
34af0 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
34b00 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
34b10 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
34b20 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
34b30 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
34b40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
34b50 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
34b60 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
34b70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
34b80 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
34b90 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
34ba0 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
34bb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
34bc0 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
34bd0 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
34be0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
34bf0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
34c00 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
34c10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
34c20 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
34c30 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
34c40 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
34c50 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
34c60 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f  RITE;.    pager_
34c70 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
34c80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
34c90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
34ca0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
34cb0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
34cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34cd0 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
34ce0 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
34cf0 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
34d00 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
34d10 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
34d20 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
34d30 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
34d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
34d50 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
34d60 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
34d70 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
34d80 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
34d90 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
34da0 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
34db0 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
34dc0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
34dd0 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
34de0 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
34df0 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
34e00 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
34e10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
34e20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
34e30 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
34e40 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
34e50 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
34e60 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
34e70 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
34e80 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
34e90 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
34ea0 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
34eb0 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
34ec0 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
34ed0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
34ee0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34ef0 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
34f00 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
34f10 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
34f20 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
34f30 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
34f40 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
34f50 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
34f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34f70 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
34f80 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
34f90 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
34fa0 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
34fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
34fd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34fe0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
34ff0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
35000 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35010 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
35020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
35030 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35040 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
35050 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
35060 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
35070 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
35080 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
35090 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
350a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
350b0 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
350c0 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
350d0 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
350e0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
350f0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
35100 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
35110 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
35120 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
35130 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
35140 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
35150 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
35160 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
35170 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
35180 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
35190 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
351a0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
351b0 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
351c0 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
351d0 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
351e0 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
351f0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
35200 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
35210 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
35220 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
35230 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
35240 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35250 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23  E_ATOMIC_WRITE.#
35260 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
35270 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20  ODE 0.  assert( 
35280 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
35290 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
352a0 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
352b0 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  de);.#else.# def
352c0 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
352d0 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e  isDirectMode.#en
352e0 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67  dif..  if( !pPag
352f0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
35300 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
35310 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
35320 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
35330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35340 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
35350 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63  e 1 */.    u32 c
35360 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20  hange_counter;  
35370 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
35380 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61  ial value of cha
35390 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
353a0 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  d */..    assert
353b0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
353c0 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ile && isOpen(pP
353d0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
353e0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
353f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
35400 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
35410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35420 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
35430 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61   &pPgHdr);.    a
35440 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30  ssert( pPgHdr==0
35450 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
35460 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
35470 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74  page one was fet
35480 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ched successfull
35490 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  y, and this func
354a0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20  tion is not.    
354b0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  ** operating in 
354c0 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b  direct-mode, mak
354d0 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c  e page 1 writabl
354e0 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20  e.  When not in 
354f0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d  .    ** direct m
35500 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61  ode, page 1 is a
35510 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61  lways held in ca
35520 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68  che and hence th
35530 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20  e PagerGet().   
35540 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77   ** above is alw
35550 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d  ays successful -
35560 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59   hence the ALWAY
35570 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f  S on rc==SQLITE_
35580 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OK..    */.    i
35590 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20  f( !DIRECT_MODE 
355a0 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51  && ALWAYS(rc==SQ
355b0 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
355c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
355d0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
355e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
355f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35600 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
35610 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
35620 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
35630 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
35640 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
35650 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
35660 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
35670 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
35680 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
35690 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
356a0 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
356b0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
356c0 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
356d0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
356e0 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74        /* Also st
356f0 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
35700 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
35710 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e   bytes 96..99 an
35720 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  d in.      ** by
35730 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
35740 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
35750 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
35760 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
35770 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61 6c  .      ** is val
35780 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75 74  id. */.      put
35790 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
357a0 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 32  PgHdr->pData)+92
357b0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
357c0 29 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  );.      put32bi
357d0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
357e0 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  r->pData)+96, SQ
357f0 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
35800 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  BER);..      /* 
35810 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
35820 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
35830 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
35840 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
35850 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
35860 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
35870 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
35880 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20  oid *zBuf;.     
35890 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
358a0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
358b0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
358c0 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72  2(pPager, pPgHdr
358d0 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72  ->pData, 1, 6, r
358e0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
358f0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69  zBuf);.        i
35900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
35920 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
35930 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
35940 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
35950 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
35960 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
35970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35980 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
35990 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
359a0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
359b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
359c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
359d0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
359e0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
359f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
35a00 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
35a10 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
35a20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35a30 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
35a40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35a50 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
35a60 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
35a70 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
35a80 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
35a90 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
35aa0 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
35ab0 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
35ac0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
35ad0 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
35ae0 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
35af0 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
35b00 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
35b10 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
35b20 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
35b30 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
35b40 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
35b50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
35b60 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
35b70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
35b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35ba0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35bb0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
35bc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
35bd0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
35be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
35c00 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
35c10 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
35c20 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
35c30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
35c50 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
35c60 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c  y be called whil
35c70 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  e a write-transa
35c80 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
35c90 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20  in.** rollback. 
35ca0 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
35cb0 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  n is in WAL mode
35cc0 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  , this call is a
35cd0 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65   no-op. .** Othe
35ce0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
35cf0 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nnection does no
35d00 74 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  t already have a
35d10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
35d20 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
35d30 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74  base file, an at
35d40 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
35d50 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a   obtain one..**.
35d60 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53  ** If the EXCLUS
35d70 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  IVE lock is alre
35d80 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20  ady held or the 
35d90 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
35da0 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65  n it is.** succe
35db0 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f  ssful, or the co
35dc0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
35dd0 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f  AL mode, SQLITE_
35de0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
35df0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69  ** Otherwise, ei
35e00 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59  ther SQLITE_BUSY
35e10 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   or an SQLITE_IO
35e20 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
35e30 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
35e40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
35e50 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
35e60 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
35e70 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
35e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
35e90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35ea0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35eb0 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20  R_CACHEMOD .    
35ec0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
35ed0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35ee0 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20  ER_DBMOD .      
35ef0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
35f00 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35f10 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20  _LOCKED .  );.  
35f20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
35f30 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
35f40 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70  r) );.  if( 0==p
35f50 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35f60 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
35f70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
35f80 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
35f90 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20  IVE_LOCK);.  }. 
35fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35fb0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
35fc0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
35fd0 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
35fe0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
35ff0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
36000 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
36010 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
36020 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
36030 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
36040 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
36050 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
36060 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
36070 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
36080 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
36090 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
360a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
360b0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
360c0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
360d0 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
360e0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
360f0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
36100 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
36110 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
36120 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
36130 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
36140 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
36150 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
36160 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
36170 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
36180 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
36190 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
361a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
361b0 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
361c0 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
361d0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
361e0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
361f0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
36200 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
36210 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
36220 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
36230 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
36240 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
36250 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
36260 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
36270 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
36280 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
36290 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
362a0 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
362b0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
362c0 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
362d0 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
362e0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
362f0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
36300 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
36310 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
36320 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
36330 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
36340 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
36350 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
36360 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
36370 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
36380 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
36390 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
363a0 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
363b0 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
363c0 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
363d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
363e0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
363f0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
36400 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
36410 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
36420 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
36430 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36440 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
36450 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36470 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
36480 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
36490 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
364a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
364b0 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
364c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
364d0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
364e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
36500 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
36510 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
36520 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
36530 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
36540 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
36550 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
36560 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36570 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36580 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
36590 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
365a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
365b0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
365c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
365d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
365e0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
365f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36600 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20  GER_ERROR.  );. 
36610 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36620 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36630 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
36640 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
36650 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
36660 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
36670 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
36680 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
36690 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
366a0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
366b0 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
366c0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
366d0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
366e0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
366f0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
36700 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
36710 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
36720 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62    /* If no datab
36730 61 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65  ase changes have
36740 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75   been made, retu
36750 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
36760 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
36770 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e<PAGER_WRITER_C
36780 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e  ACHEMOD ) return
36790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
367a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
367b0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
367c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
367d0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
367e0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
367f0 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   or this.    ** 
36800 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
36810 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
36820 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61  , it is mostly a
36830 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72   no-op.  However
36840 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63  , any.    ** bac
36850 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20  kup in progress 
36860 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
36870 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  arted..    */.  
36880 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
36890 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
368a0 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
368b0 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  {.    if( pagerU
368c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
368d0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c  .      PgHdr *pL
368e0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
368f0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
36900 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
36910 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29       if( pList )
36920 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36930 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
36940 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61  ager, pList, pPa
36950 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20  ger->dbSize, 1, 
36960 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
36970 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f  ager->fullSync ?
36980 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
36990 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20  ags : 0).       
369a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
369b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
369c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
369d0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
369e0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
369f0 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ache);.      }. 
36a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36a10 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
36a20 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
36a30 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
36a40 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
36a50 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20  t.      ** does 
36a60 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20  this depends on 
36a70 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
36a80 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
36a90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
36aa0 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
36ab0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
36ac0 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
36ad0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
36ae0 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
36af0 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61  runtime criteria
36b00 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72   to use the oper
36b10 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a  ation: .      **
36b20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
36b30 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
36b40 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
36b50 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
36b60 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20  y for.      **  
36b70 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
36b80 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
36b90 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  d .      **    *
36ba0 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
36bb0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
36bc0 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
36bd0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
36be0 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
36bf0 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
36c00 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
36c10 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
36c20 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
36c30 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
36c40 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
36c50 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
36c60 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
36c70 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
36c80 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
36c90 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75  angecounter() fu
36ca0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
36cb0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
36cc0 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63  hange.      ** c
36cd0 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72  ounter in 'indir
36ce0 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68  ect-mode'. If th
36cf0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
36d00 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75  s compiled in bu
36d10 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f  t.      ** is no
36d20 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20  t applicable to 
36d30 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
36d40 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f  , call sqlite3Jo
36d50 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20  urnalCreate().  
36d60 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73      ** to make s
36d70 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
36d80 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c  file has actuall
36d90 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
36da0 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20  then call.      
36db0 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
36dc0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
36dd0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
36de0 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e  ge-counter in in
36df0 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  direct.      ** 
36e00 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  mode. .      **.
36e10 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
36e20 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
36e30 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
36e40 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
36e50 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a  icable,.      **
36e60 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72   then call pager
36e70 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
36e80 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20  ter() to update 
36e90 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
36ea0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27  er.      ** in '
36eb0 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e  direct' mode. In
36ec0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
36ed0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
36ee0 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20 20   never be.      
36ef0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
36f00 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
36f10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64  .      */.  #ifd
36f20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
36f30 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
36f40 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
36f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
36f60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
36f70 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
36f80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36f90 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36fa0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
36fb0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
36fc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
36fd0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36fe0 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
36ff0 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
37000 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  er && isOpen(pPa
37010 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
37020 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
37030 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
37040 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
37050 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65  .       && pPage
37060 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
37070 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20  r->dbOrigSize.  
37080 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
37090 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
370a0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
370b0 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
370c0 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
370d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
370e0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
370f0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
37100 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72  nter via the dir
37110 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64  ect-write method
37120 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
37130 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  * following call
37140 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65   will modify the
37150 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
37160 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
37170 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  e 1 .        ** 
37180 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
37190 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
371a0 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
371b0 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
371c0 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
371d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
371e0 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
371f0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
37200 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  te .        ** p
37210 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
37220 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
37230 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
37240 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37250 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
37260 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
37270 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
37280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
372a0 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
372b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
372c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
372d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
372e0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
372f0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
37300 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
37310 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65    }.      }.  #e
37320 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70  lse.      rc = p
37330 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
37340 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
37350 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  0);.  #endif.   
37360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37370 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
37380 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
37390 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  t;.  .      /* I
373a0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
373b0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
373c0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
373d0 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
373e0 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
373f0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
37400 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
37410 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
37420 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
37430 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63   ** file. This c
37440 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
37450 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
37460 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  de..      **.   
37470 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
37480 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
37490 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
374a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
374b0 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
374c0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
374d0 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62  r.dbSize, set db
374e0 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  Size back to the
374f0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
37500 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20  that it took at 
37510 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
37520 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74   transaction. Ot
37530 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20  herwise, the.   
37540 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
37550 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
37560 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70   return zeroed p
37570 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ages instead of 
37580 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  .      ** readin
37590 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
375a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
375b0 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65       */.  #ifnde
375c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
375d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
375e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
375f0 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
37600 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20  Size .       && 
37610 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
37620 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
37630 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20  ALMODE_OFF.     
37640 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
37650 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
37660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37670 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
37680 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
37690 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
376a0 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
376b0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20  J_PGNO(pPager); 
376c0 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  /* Pending lock 
376d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
376e0 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a  const Pgno dbSiz
376f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
37700 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ze;       /* Dat
37710 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65  abase image size
37720 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61   */ .        pPa
37730 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
37740 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
37750 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
37760 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  =dbSize+1; i<=pP
37770 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
37780 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
37790 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
377a0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
377b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
377c0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
377d0 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48 64              PgHd
377e0 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
377f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37800 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
37810 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37820 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
37830 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
37840 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37860 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
37870 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
37880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
37890 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
378a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
378b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
378c0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
378d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
378e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
378f0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
37900 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
37910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
37920 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
37930 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
37940 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64  .      } .  #end
37950 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57  if.  .      /* W
37960 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
37970 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
37980 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
37990 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20  le. If a master 
379a0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
379b0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
379c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
379d0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
379e0 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20  nal file, .     
379f0 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65   ** or if zMaste
37a00 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61  r is NULL (no ma
37a10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74  ster journal), t
37a20 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
37a30 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20   a no-op..      
37a40 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  */.      rc = wr
37a50 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
37a60 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
37a70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
37a90 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
37aa0 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
37ab0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
37ac0 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 77  urnal file and w
37ad0 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
37ae0 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
37af0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49  base..      ** I
37b00 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
37b10 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
37b20 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2c 20   is being used, 
37b30 74 68 69 73 20 73 79 6e 63 20 77 69 6c 6c 20 6e  this sync will n
37b40 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ot .      ** cre
37b50 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
37b60 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20  file or perform 
37b70 61 6e 79 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20  any real IO..   
37b80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
37b90 65 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67  ecause the chang
37ba0 65 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 20 77  e-counter page w
37bb0 61 73 20 6a 75 73 74 20 6d 6f 64 69 66 69 65 64  as just modified
37bc0 2c 20 75 6e 6c 65 73 73 20 74 68 65 0a 20 20 20  , unless the.   
37bd0 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 75 70 64     ** atomic-upd
37be0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
37bf0 20 69 73 20 75 73 65 64 20 69 74 20 69 73 20 61   is used it is a
37c00 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
37c10 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
37c20 6a 6f 75 72 6e 61 6c 20 72 65 71 75 69 72 65 73  journal requires
37c30 20 61 20 73 79 6e 63 20 68 65 72 65 2e 20 48 6f   a sync here. Ho
37c40 77 65 76 65 72 2c 20 69 6e 20 6c 6f 63 6b 69 6e  wever, in lockin
37c50 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
37c60 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73  .      ** on a s
37c70 79 73 74 65 6d 20 75 6e 64 65 72 20 6d 65 6d 6f  ystem under memo
37c80 72 79 20 70 72 65 73 73 75 72 65 20 69 74 20 69  ry pressure it i
37c90 73 20 6a 75 73 74 20 70 6f 73 73 69 62 6c 65 20  s just possible 
37ca0 74 68 61 74 20 74 68 69 73 20 69 73 20 0a 20 20  that this is .  
37cb0 20 20 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 63      ** not the c
37cc0 61 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ase. In this cas
37cd0 65 20 69 74 20 69 73 20 6c 69 6b 65 6c 79 20 65  e it is likely e
37ce0 6e 6f 75 67 68 20 74 68 61 74 20 74 68 65 20 72  nough that the r
37cf0 65 64 75 6e 64 61 6e 74 0a 20 20 20 20 20 20 2a  edundant.      *
37d00 2a 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 20 77  * xSync() call w
37d10 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
37d20 6f 20 61 20 6e 6f 2d 6f 70 20 62 79 20 74 68 65  o a no-op by the
37d30 20 4f 53 20 61 6e 79 68 6f 77 2e 20 0a 20 20 20   OS anyhow. .   
37d40 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
37d50 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
37d60 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
37d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37d80 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
37d90 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
37da0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67   .      rc = pag
37db0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
37dc0 74 28 70 50 61 67 65 72 2c 73 71 6c 69 74 65 33  t(pPager,sqlite3
37dd0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
37de0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
37df0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
37e20 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
37e30 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
37e40 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68    goto commit_ph
37e50 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
37e60 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
37e70 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
37e80 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
37e90 65 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  e);.  .      /* 
37ea0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
37eb0 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73  isk is not the s
37ec0 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20  ame size as the 
37ed0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a  database image,.
37ee0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73        ** then us
37ef0 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e pager_truncate
37f00 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69   to grow or shri
37f10 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65  nk the file here
37f20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37f30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
37f40 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize!=pPager->dbF
37f50 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
37f60 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70     Pgno nNew = p
37f70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20  Pager->dbSize - 
37f80 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d  (pPager->dbSize=
37f90 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
37fa0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
37fb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37fc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37fd0 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
37fe0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
37ff0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
38000 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, nNew);.      
38010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38020 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
38030 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
38040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
38050 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
38060 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
38070 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
38080 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
38090 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
380a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
380b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
380c0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
380d0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
380e0 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52      }.      IOTR
380f0 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
38100 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
38110 20 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70   }.  }..commit_p
38120 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20  hase_one_exit:. 
38130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38140 4f 4b 20 26 26 20 21 70 61 67 65 72 55 73 65 57  OK && !pagerUseW
38150 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
38160 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
38170 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
38180 46 49 4e 49 53 48 45 44 3b 0a 20 20 7d 0a 20 20  FINISHED;.  }.  
38190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
381a0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
381b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
381c0 64 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  d, the database 
381d0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f  file has been co
381e0 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61  mpletely.** upda
381f0 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74  ted to reflect t
38200 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
38210 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
38220 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a  ransaction and.*
38230 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
38240 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
38250 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  le still exists 
38260 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
38270 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61  em .** though, a
38280 6e 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  nd if a failure 
38290 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
382a0 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65  oint it will eve
382b0 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73  ntually.** be us
382c0 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
382d0 6e 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72  nal and the curr
382e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
382f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
38300 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
38310 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
38320 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74  ournal file, eit
38330 68 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c  her by deleting,
38340 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20   .** truncating 
38350 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72  or partially zer
38360 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74  oing it, so that
38370 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73   it cannot be us
38380 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a  ed .** for hot-j
38390 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
383a0 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f   Once this is do
383b0 6e 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ne the transacti
383c0 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63  on is.** irrevoc
383d0 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  ably committed..
383e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
383f0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  r occurs, an IO 
38400 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
38410 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
38420 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e  ager.** moves in
38430 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
38440 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  te. Otherwise, S
38450 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
38460 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
38470 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
38480 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
38490 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
384a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
384b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
384c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
384d0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
384e0 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ine should not b
384f0 65 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72  e called if a pr
38500 69 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ior error has oc
38510 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74  curred..  ** But
38520 20 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f   if (due to a co
38530 64 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77  ding error elsew
38540 68 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74  here in the syst
38550 65 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a  em) it does get.
38560 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73    ** called, jus
38570 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
38580 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74  e error code wit
38590 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
385a0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ing. */.  if( NE
385b0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
385c0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
385d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
385e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
385f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
38600 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
38610 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
38620 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
38630 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
38640 20 20 20 20 20 7c 7c 20 28 70 61 67 65 72 55 73       || (pagerUs
38650 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
38660 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38670 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
38680 48 45 4d 4f 44 29 0a 20 20 29 3b 0a 20 20 61 73  HEMOD).  );.  as
38690 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
386a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
386b0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74   );..  /* An opt
386c0 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
386d0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
386e0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
386f0 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
38700 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
38710