/ Hex Artifact Content
Login

Artifact 3327c903932466adead8b4f4e9c6e5f958cae2a9:


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 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7ff0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
8000: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
8010: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
8020: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
8030: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
8040: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
8050: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
8060: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
8070: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
8080: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
8090: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
80a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
80b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
80c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
80d0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
80e0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
80f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8100: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8110: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8120: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8130: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8140: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8150: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
8160: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8180: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
81a0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
81b0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
81c0: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
81e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
81f0: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8200: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8210: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8220: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8230: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8240: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8250: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
8260: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
8270: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8280: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
8290: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
82a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
82b0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
82e0: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
82f0: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8300: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8320: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8330: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8340: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8350: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8360: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8370: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8380: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8390: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
83a0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
83b0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
83c0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
83d0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
83e0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
83f0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
8400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8420: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8430: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 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 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8460: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8470: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8490: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
84a0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
84b0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
84c0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
84d0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
84e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
84f0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
8500: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8510: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8530: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8540: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8550: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8560: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8570: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8580: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8590: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
85a0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
85b0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
85c0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
85d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
85e0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
85f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8600: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8610: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8620: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8630: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8640: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8650: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8660: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8670: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8680: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8690: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
86a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
86b0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
86c0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
86d0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
86e0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
86f0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8700: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8710: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8720: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8730: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8740: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8750: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8760: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8770: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8780: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8790: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
87a0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
87b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
87c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
87d0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
87e0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
87f0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8800: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8810: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8820: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8830: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8840: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8850: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8860: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8870: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8880: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8890: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
88a0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
88b0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
88c0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
88d0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
88e0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
88f0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8900: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8910: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8920: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8930: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8940: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8950: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8960: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8970: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8980: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8990: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
89a0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
89b0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
89c0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
89d0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
89e0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
89f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8a00: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8a10: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8a20: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8a30: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8a40: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8a50: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8a60: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8a70: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8a80: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8a90: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8aa0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8ab0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8ad0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8ae0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8b00: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
8b10: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
8b20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8b30: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
8b40: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
8b50: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
8b60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
8b70: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
8b80: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
8b90: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
8ba0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
8bb0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
8bc0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
8bd0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
8be0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8bf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8c00: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
8c10: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
8c20: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
8c30: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
8c40: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
8c50: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8c60: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
8c70: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
8c80: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
8c90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
8ca0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
8cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
8cc0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
8cd0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
8ce0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
8cf0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
8d00: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
8d10: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
8d20: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
8d30: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
8d40: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
8d50: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8d60: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
8d70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
8d80: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
8da0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
8db0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
8dc0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
8dd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
8de0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
8df0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
8e00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
8e10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
8e20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
8e30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
8e40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
8e50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
8e60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
8e70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
8e80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
8e90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
8ea0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
8eb0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
8ec0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
8ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
8ee0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
8ef0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
8f00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
8f10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
8f20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
8f30: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
8f40: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
8f50: 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  og instead of th
8f60: 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62  e usual.** rollb
8f70: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68  ack journal. Oth
8f80: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
8f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8fa0: 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20  OMIT_WAL.static 
8fb0: 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c 28  int pagerUseWal(
8fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8fd0: 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
8fe0: 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65  ->pWal!=0);.}.#e
8ff0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
9000: 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20  erUseWal(x) 0.# 
9010: 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c  define pagerRoll
9020: 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64  backWal(x) 0.# d
9030: 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72  efine pagerWalFr
9040: 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20  ames(v,w,x,y,z) 
9050: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9060: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9070: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9090: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
90a0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
90b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
90c0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
90d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
90e0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
90f0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9110: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9120: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9130: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9140: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9150: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9160: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9170: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9180: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9190: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
91a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
91b0: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
91c0: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
91d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
91e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
91f0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9200: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9210: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9220: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9230: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9240: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9250: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9260: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9270: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9280: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9290: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
92b0: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
92c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92d0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
92e0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
92f0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9300: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9310: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9320: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9330: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9340: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9350: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9360: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9370: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9380: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9390: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
93a0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
93b0: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
93c0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
93d0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
93e0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
93f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9410: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9420: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9430: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9440: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9450: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9460: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9470: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9480: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9490: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
94a0: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
94b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
94c0: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
94d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
94e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
94f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9500: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9520: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9530: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9540: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9550: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9560: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9570: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9580: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9590: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
95a0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
95b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
95c0: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
95d0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
95e0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
95f0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9600: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9610: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9620: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9630: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9640: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9650: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9660: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9670: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9680: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9690: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
96a0: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
96c0: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
96d0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
96e0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
96f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9700: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9710: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9720: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9730: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9750: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9760: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9770: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9780: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
97a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
97b0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
97c0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
97d0: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
97e0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
97f0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9800: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9810: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9820: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9830: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9840: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9850: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9860: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9870: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9880: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9890: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
98a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
98b0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
98c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
98e0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
98f0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9900: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9910: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9920: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9930: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9940: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9950: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9960: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9970: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9980: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9990: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
99a0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
99b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
99c0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
99d0: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
99e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
99f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9a00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9a10: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9a20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9a40: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9a50: 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c  CK || p->noReadl
9a60: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ock );.      bre
9a70: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9a80: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9a90: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9aa0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ab0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ad0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ae0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9af0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9b00: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9b10: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b20: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9b30: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9b40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9b50: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9b60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9b80: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9b90: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ba0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9bb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9bc0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9bd0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9be0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9c00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9c10: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9c20: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9c30: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9c40: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9c50: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9c60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9c70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9c80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9c90: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ca0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9cb0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
9cc0: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
9cd0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
9ce0: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
9cf0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
9d00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
9d10: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
9d20: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
9d30: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
9d40: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
9d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
9d60: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
9d70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
9d80: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
9d90: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
9da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9db0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9dc0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9dd0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
9de0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9df0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9e00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9e10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9e20: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9e30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9e40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9e50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
9e60: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9e80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ea0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ec0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9ed0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ee0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
9ef0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9f00: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9f10: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f30: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
9f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9f60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9f70: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
9f80: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
9f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9fa0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
9fb0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9fc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9fd0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9fe0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9ff0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a000: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a010: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a040: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a050: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a060: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a070: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a090: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a0a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a0c0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a0d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a0e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a0f0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a100: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a110: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a120: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a130: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a140: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a150: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a160: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a170: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a180: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a190: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a1a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1b0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1d0: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a1e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a1f0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a200: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a210: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a220: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a230: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a240: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a250: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a260: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a270: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a280: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a2a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a2b0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a2c0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a2d0: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a2e0: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a2f0: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a320: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a330: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a340: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a360: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a370: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a380: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a390: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a3a0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a3b0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a3c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a3d0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a3e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a3f0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a400: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a410: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a420: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a430: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a440: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a450: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a460: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a470: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a480: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a490: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a4a0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a4b0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a4d0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a4e0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a4f0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a500: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a510: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a520: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a530: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a540: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a550: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a560: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a570: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a580: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a590: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a5a0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a5b0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a5c0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a5d0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a5e0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a5f0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a600: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a610: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a620: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a630: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a640: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a650: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a660: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a670: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a680: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a690: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a6a0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a6b0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
a6c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a6d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a6e0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
a6f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
a700: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a710: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a720: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
a730: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
a740: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a750: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a760: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
a770: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
a780: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a790: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a7a0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
a7b0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
a7c0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7d0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
a7e0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
a7f0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
a800: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
a810: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
a820: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
a830: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
a840: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a850: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
a860: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
a870: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a880: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a890: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
a8a0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
a8b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a8c0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
a8d0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a8e0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
a8f0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
a900: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
a910: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
a920: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
a930: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
a940: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
a950: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a960: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a970: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
a980: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
a990: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
a9b0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
a9c0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
a9d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a9e0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
a9f0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
aa00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aa10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aa20: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
aa30: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
aa40: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
aa70: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aa90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aaa0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
aab0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
aac0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
aad0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
aae0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
aaf0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ab00: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ab10: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ab20: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ab30: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ab40: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ab50: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
ab60: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
ab70: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
ab80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
ab90: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aba0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
abb0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
abc0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
abd0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
abe0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
abf0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
ac00: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
ac10: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
ac20: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
ac30: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
ac40: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
ac50: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
ac60: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ac70: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ac80: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ac90: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
aca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
acb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
acc0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
acd0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ace0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
acf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ad00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ad10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
ad20: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
ad30: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
ad40: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ad50: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
ad60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
ad70: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
ad80: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
ad90: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
ada0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
adb0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
adc0: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
add0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
ade0: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
adf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
ae00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ae10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ae20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ae30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
ae40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
ae50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ae60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ae70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
ae80: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
ae90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
aea0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
aeb0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
aec0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
aed0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
aee0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
aef0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
af00: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
af10: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
af20: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
af30: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
af40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
af50: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
af60: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
af70: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
af80: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
af90: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
afa0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
afb0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
afd0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
afe0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
aff0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b000: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b010: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b030: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b040: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b050: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b070: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b080: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b0a0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b0b0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b0c0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b0d0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b0e0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b0f0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b100: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b110: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b120: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b130: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b140: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b150: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b170: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b180: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b190: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b1a0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b1b0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b1c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b1d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b1e0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b1f0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b200: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b220: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b230: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b240: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b250: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b260: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b270: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b280: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b290: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b2a0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b2b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b2c0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b2d0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b2e0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b2f0: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b300: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b310: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b320: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b330: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b340: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b350: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b360: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b370: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b380: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b390: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b3a0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b3b0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b3c0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b3d0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b3e0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b400: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b420: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b430: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b440: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b450: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b460: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b470: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b480: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b490: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b4a0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b4b0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b4c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b4d0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b4e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b4f0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b500: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b510: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b520: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b530: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b540: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b550: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b560: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b570: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b580: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b590: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b5a0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b5b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b5d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b5e0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b5f0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b600: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b610: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b620: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b630: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b640: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b650: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b660: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b670: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b680: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b690: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b6a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b6b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b6c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b6d0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
b6e0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b6f0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
b700: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b710: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
b720: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
b730: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b740: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
b750: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b760: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
b770: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
b780: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
b790: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b7a0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b7b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b7c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
b7d0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
b7e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
b7f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
b800: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b810: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
b820: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
b830: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
b840: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b850: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
b860: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
b870: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b880: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b890: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
b8a0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b8b0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
b8c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
b8d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b8e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b8f0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
b900: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
b910: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
b920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b930: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
b950: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
b960: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
b970: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
b980: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
b990: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
b9a0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
b9b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
b9c0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
b9d0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
b9e0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
b9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ba00: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
ba10: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
ba20: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
ba30: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
ba40: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
ba50: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
ba60: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
ba70: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
ba80: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
ba90: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
baa0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
bac0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
bad0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
bae0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
baf0: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
bb00: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
bb10: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
bb20: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
bb30: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
bb40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
bb50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bb60: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
bb70: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bb80: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bb90: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bba0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bbb0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bbc0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bbd0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bbe0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bbf0: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bc00: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bc10: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bc20: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bc30: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bc50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bc60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bc70: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bc80: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bcb0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
bcc0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
bcd0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
bcf0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
bd00: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
bd40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
bd50: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
bd60: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
bd70: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
bd80: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
bd90: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
bda0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
bdb0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
bdc0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
bdd0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bde0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
bdf0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
be00: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
be10: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
be20: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
be30: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
be40: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
be50: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
be60: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
be70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
be80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
be90: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
bea0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
beb0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
bec0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
bed0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
bee0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
bef0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
bf00: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
bf10: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
bf20: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
bf30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
bf40: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bf50: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
bf60: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
bf70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
bf80: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
bf90: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
bfa0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
bfb0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
bfd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
bfe0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
bff0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c000: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c010: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c020: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c030: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c040: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c050: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c060: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c070: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c080: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c0a0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c0b0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c0c0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c0d0: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c0e0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c0f0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c100: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c110: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c120: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c130: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c150: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c160: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c170: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c180: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c190: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c1a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c1b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c1c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c1d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c1e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c1f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c200: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c210: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c220: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c230: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c240: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c250: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c260: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c270: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c280: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c290: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c2b0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c2c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c2d0: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c2e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c2f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c300: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c310: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c320: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c330: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c340: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c350: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c360: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c370: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c380: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c390: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c3a0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c3b0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c3c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c3d0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c3e0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c3f0: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c400: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c420: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c430: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c440: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c450: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c460: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c470: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c480: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c490: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c4a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c4b0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c4c0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c4d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c4e0: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c4f0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c500: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c510: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c520: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c530: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c540: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c550: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c560: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c570: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c580: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c590: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c5a0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c5b0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c5d0: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c5e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c5f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c600: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c610: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c620: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c630: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c640: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c650: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c670: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c690: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c6b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
c6c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c6d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
c6e0: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
c6f0: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
c700: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
c710: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
c720: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
c730: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
c740: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
c750: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
c760: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
c770: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
c780: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
c790: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
c7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c7b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
c7c0: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
c7d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
c7e0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
c810: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
c820: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
c830: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
c840: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c860: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
c870: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
c880: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
c890: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
c8a0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c8d0: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
c900: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
c910: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
c920: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c940: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
c950: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
c960: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
c970: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
c990: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
c9a0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
c9b0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
c9e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
c9f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
ca00: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
ca10: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
ca20: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
ca30: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
ca40: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
ca50: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ca60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ca70: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
ca80: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
ca90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
caa0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cab0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
cac0: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
cad0: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
cae0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
caf0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
cb00: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
cb10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cb20: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cb30: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
cb40: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
cb50: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cb60: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
cb70: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cb80: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cb90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cba0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cbb0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cbd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cbe0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cbf0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cc00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cc10: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cc20: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cc30: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cc40: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cc50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cc60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cc70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cc80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cc90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cca0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
ccb0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
ccc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
ccd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
cce0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
ccf0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
cd00: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
cd10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
cd20: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
cd30: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
cd40: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
cd50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
cd60: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
cd70: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
cd80: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
cd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cda0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
cdb0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
cdc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
cdd0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
cde0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
cdf0: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
ce00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
ce10: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
ce20: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
ce30: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
ce40: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
ce50: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
ce60: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
ce70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
ce80: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
ce90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
cf10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
cf20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
cf30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
cf40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
cf50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
cf60: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
cf70: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
cf80: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
cf90: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
cfa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cfb0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
cfc0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
cfd0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
cfe0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
cff0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d000: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d010: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d030: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d040: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d050: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d060: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d070: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d080: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d0a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d0b0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d0c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d0d0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d0e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d0f0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d100: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d110: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d120: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d140: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d150: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d160: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d170: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d180: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d190: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d1a0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d1b0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d1c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d1d0: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d1e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d1f0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d200: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d210: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d220: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d230: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d240: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d250: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d260: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d270: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d280: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d290: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d2a0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d2b0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d2d0: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d2e0: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d2f0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d300: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d310: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d320: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d330: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d340: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d350: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d360: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d370: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d380: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d3a0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d3b0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d3c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d3e0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d3f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d410: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d420: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d430: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d440: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d450: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d460: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d470: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d480: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d490: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d4a0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d4f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d500: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d510: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d530: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d540: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d550: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d560: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d570: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d580: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d590: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d5a0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d5b0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d5c0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d5d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5e0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d5f0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d610: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d620: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d630: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d640: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d650: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d660: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d670: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d690: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d6a0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d6b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
d6c0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
d6d0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
d6e0: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
d6f0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
d700: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
d710: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
d720: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
d730: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
d740: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
d750: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
d760: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
d770: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
d780: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
d790: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
d7a0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
d7b0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
d7c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
d7d0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
d7e0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
d7f0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
d800: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
d810: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
d820: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
d830: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
d840: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d850: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
d860: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d870: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
d880: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
d890: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8a0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d8b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
d8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d8d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
d8e0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
d8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d900: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
d910: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
d920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d940: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d950: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d960: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
d970: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d980: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
d990: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
d9a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
d9b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
d9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
d9d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
d9e0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
d9f0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
da00: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
da10: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
da20: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
da30: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
da40: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
da50: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
da60: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
da70: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
da80: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
da90: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
daa0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
dab0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
dac0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
dad0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
dae0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
daf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
db00: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
db10: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
db20: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
db30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
db40: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
db50: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
db60: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
db70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
db80: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
db90: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dba0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
dbb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
dbc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
dc00: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
dc10: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
dc20: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
dc30: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
dc40: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
dc50: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dc60: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dc70: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dc80: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dc90: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dca0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
dcd0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
dce0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
dcf0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dd20: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
dd30: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dd40: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
dd50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
dd60: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
dd70: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
dd80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd90: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
dda0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ddb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ddc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ddd0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
dde0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ddf0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
de00: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
de10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
de20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
de30: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
de40: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
de50: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
de60: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
de70: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
de80: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
de90: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
dea0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
deb0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
dec0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ded0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
dee0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
def0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
df00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
df10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
df20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
df30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
df40: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
df50: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
df60: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
df70: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
df80: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
df90: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
dfa0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
dfb0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
dfc0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
dfd0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
dfe0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
dff0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e000: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e010: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e040: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e050: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e060: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e070: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e080: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e090: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e0a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e0b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e0c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e0d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e0e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e0f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e100: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e110: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e120: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e130: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e140: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e160: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e170: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e180: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e190: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e1a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e1b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e1c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e1d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e1e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e1f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e200: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e210: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e220: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e230: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e240: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e250: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e260: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e270: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e280: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e290: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e2a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e2b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e2c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e2d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e2e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e2f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e300: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e310: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e320: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e330: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e340: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e350: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e360: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e370: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e380: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e390: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e3c0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e3d0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e3e0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e3f0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e400: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e410: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e420: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e430: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e440: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e450: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e460: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e470: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e480: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e4a0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e4b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e4c0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e4d0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e4e0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e4f0: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e500: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e510: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e520: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e540: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e550: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e560: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e570: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e580: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e590: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e5a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e5b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e5d0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e5e0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e5f0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e600: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e610: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e620: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e640: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e650: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e660: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e670: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e680: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e690: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e6a0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e6b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
e6c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
e6d0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
e6e0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e6f0: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
e700: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
e710: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e720: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
e730: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
e740: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
e750: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
e760: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
e770: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
e780: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
e790: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
e7a0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
e7b0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
e7c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e7d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
e7e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
e7f0: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
e800: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
e810: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
e820: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
e830: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
e840: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
e850: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
e860: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
e870: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
e880: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
e890: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
e8a0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
e8b0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
e8c0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
e8d0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
e8e0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
e8f0: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
e900: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
e910: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
e920: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
e930: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
e940: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
e950: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
e960: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
e970: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
e980: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
e990: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
e9a0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
e9b0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
e9c0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
e9d0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
e9e0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
e9f0: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ea00: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ea10: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ea20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ea30: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ea40: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ea50: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
ea60: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
ea70: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
ea80: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
ea90: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
eaa0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
eab0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
eac0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ead0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
eae0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
eaf0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
eb00: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
eb10: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
eb20: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
eb30: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
eb40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
eb50: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eb60: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eb70: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eb80: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eb90: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eba0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
ebb0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ebc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ebd0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ebe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ebf0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ec00: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ec10: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ec20: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ec30: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ec40: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ec50: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ec60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
ec70: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
ec80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ec90: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
eca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ecb0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
ecd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ece0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
ecf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
ed00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ed10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
ed20: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
ed30: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
ed40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ed50: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
ed60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
ed70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
ed80: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ed90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
eda0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
edb0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
edc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
edd0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ede0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
edf0: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ee00: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ee10: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ee20: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ee30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ee40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ee50: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ee60: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ee70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ee80: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ee90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
eea0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
eeb0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
eec0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
eed0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
eee0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
eef0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ef00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ef10: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ef20: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ef30: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ef40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ef50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ef60: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
ef70: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ef80: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
ef90: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
efb0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
efc0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
efd0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
efe0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
eff0: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f000: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f010: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f020: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f030: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f040: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f050: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f060: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f070: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f080: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f090: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f0b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f0c0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f0d0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f0f0: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f100: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f110: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f130: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f140: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f150: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f160: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f180: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f190: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f1a0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f1b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f1f0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f200: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f210: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f220: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f230: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f240: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f250: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f260: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f270: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f280: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f290: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f2a0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2b0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f2c0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f2d0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f2e0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f2f0: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f300: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f310: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f320: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f330: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f340: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f350: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f360: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f380: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f390: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f3a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f3b0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f3c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f3d0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f400: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f410: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f420: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f430: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f440: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f450: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f460: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f470: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f480: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f490: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f4a0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f4b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f4c0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f4d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f4e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f4f0: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f500: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f510: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f520: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f530: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f560: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f570: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f580: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f5a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f5b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f5c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f5d0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f5f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f610: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f620: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f640: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f650: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f660: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f670: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f680: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f690: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f6a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f6b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f6c0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
f6d0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
f6e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
f6f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f700: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f710: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
f720: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f730: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f740: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f750: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
f760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f770: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f780: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f790: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f7a0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
f7b0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
f7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f7d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
f7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
f7f0: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
f800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f810: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
f820: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f830: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
f840: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
f860: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
f870: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f880: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
f890: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
f8a0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
f8b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f8c0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
f8d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f8e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f8f0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f900: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
f910: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
f920: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f930: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f940: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
f950: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
f960: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
f970: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f980: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
f990: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
f9a0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
f9b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f9c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
f9d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
f9e0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
f9f0: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fa00: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fa10: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fa20: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fa30: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fa40: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fa50: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fa60: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fa70: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fa80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fa90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
faa0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fab0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fac0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fad0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fae0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
faf0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb00: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb10: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb20: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fb30: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fb40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fb50: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fb60: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fb70: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fb80: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fb90: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fba0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fbb0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fbc0: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fbd0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fbe0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fbf0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc00: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc10: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc20: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fc30: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fc40: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fc50: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fc60: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fc70: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fc80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc90: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fca0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fcb0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fcc0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fcd0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fcf0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd10: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd20: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fd30: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fd40: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fd50: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fd60: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fd80: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fd90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fda0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fdb0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fdc0: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fdd0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fde0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fdf0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe00: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe10: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe20: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fe30: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
fe40: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fe50: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fe60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fe70: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fe80: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
fe90: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
fea0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
feb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fec0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
fed0: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
fee0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
fef0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff00: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff20: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ff30: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ff40: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ff50: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ff60: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ff70: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
ff80: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
ff90: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
ffa0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
ffb0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
ffc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
ffd0: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
ffe0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
fff0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10000 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10020 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10030 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10040 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10050 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
10060 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10070 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10080 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10090 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
100a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
100b0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
100c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
100d0 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
100e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
100f0 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10100 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10110 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10120 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10130 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10140 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10150 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
10160 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
10170 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
10180 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10190 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
101a0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
101b0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
101c0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
101d0 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
101e0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
101f0 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10200 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10220 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10230 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10240 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10250 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10260 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
10270 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10290 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
102a0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
102b0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
102c0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
102d0 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
102e0 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
102f0 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10300 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10310 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10320 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10330 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10340 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10350 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
10360 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
10370 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
10380 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10390 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
103a0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
103b0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
103c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
103d0 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
103e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
103f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10400 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10410 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10440 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10450 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
10460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10470 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
10480 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10490 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
104c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
104d0 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
104e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
104f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10500 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10510 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10520 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10550 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
10560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10570 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
10580 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
105a0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
105b0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
105c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
105d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
105e0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
105f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10600 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10610 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10650 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
10660 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
10670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10690 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
106a0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
106b0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
106c0 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
106d0 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
106e0 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
106f0 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10700 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10710 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10720 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10730 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10740 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10750 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10760 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10770 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10780 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10790 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
107a0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
107b0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
107c0 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
107d0 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
107e0 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
107f0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10800 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10810 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10830 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10840 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10850 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10870 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10890 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
108a0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
108b0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
108c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
108d0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
108e0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
108f0 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10900 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10920 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10940 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10960 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10970 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10980 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10990 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
109a0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
109b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
109c0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
109d0 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
109e0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
109f0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a00 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a10 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a20 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10a30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10a40 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10a50 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10a60 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10a70 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10a90 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10ab0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10ac0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10ad0 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10ae0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10af0 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b00 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b10 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10b30 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10b40 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10b50 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10b60 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10b70 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10b80 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10b90 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ba0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10bb0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10bc0 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10bd0 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10be0 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10bf0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c00 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10c30 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10c40 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10c50 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10c60 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10c70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10c80 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10c90 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10ca0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10cb0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10cc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10cd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10ce0 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10cf0 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d00 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10d30 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10d40 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10d60 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10d70 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10d80 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10d90 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10da0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10db0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10dc0 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10dd0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10de0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10df0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e00 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e10 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e20 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10e30 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10e60 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10e80 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10e90 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10ea0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10eb0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10ec0 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10ed0 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10ee0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10ef0 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f00 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f20 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10f30 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10f50 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10f60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10f70 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
10f90 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
10fa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10fb0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
10fc0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
10fd0 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
10fe0 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
10ff0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11000 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11010 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11020 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11030 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11040 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11050 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11060 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11070 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11080 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11090 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
110a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
110b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
110c0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
110d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
110e0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
110f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11100 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11110 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11120 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11130 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11140 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11150 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11160 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11180 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11190 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
111a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
111b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
111c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
111d0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
111e0 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
111f0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11200 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11210 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11230 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11240 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11250 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
11260 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
11270 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11280 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11290 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
112a0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
112b0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
112c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
112d0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
112e0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
112f0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11300 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11310 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11320 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11330 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11340 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11350 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
11360 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
11370 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11380 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
113b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
113c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
113d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
113e0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
113f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11400 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11410 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11420 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11430 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11440 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11450 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
11460 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
11470 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
11480 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
114a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
114b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
114c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
114d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
114e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
114f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11510 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11520 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11530 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11540 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11550 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
11560 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
11570 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
11580 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11590 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
115a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
115b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
115c0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
115d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
115e0 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
115f0 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11600 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11610 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11620 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11630 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11640 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11650 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
11660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
11670 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
11680 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11690 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
116a0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
116b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
116c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
116d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
116e0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
116f0 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11700 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11710 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11720 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11730 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11740 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11750 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11760 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11780 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11790 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
117a0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
117b0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
117c0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
117d0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
117e0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
117f0 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11800 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11810 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11830 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11840 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11850 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11860 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11870 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11880 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11890 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
118a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
118b0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
118c0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
118d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
118e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
118f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11900 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11920 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11930 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11940 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11950 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11960 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11970 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11980 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11990 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
119a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
119b0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
119c0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
119d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
119e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a10 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11a40 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11a50 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11a60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11a70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11a80 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11a90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11aa0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11ab0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11ac0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11ad0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11ae0 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11af0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b00 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b10 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11b30 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11b40 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11b50 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11b60 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11b70 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11b80 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ba0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11bb0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11bc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11bd0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c00 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c10 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c20 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c30 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11c40 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11c50 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11c60 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11c70 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11c80 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11c90 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11ca0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11cb0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11cc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11cd0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11ce0 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d00 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11d30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11d40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11d50 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11d60 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11d70 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11d80 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11d90 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11da0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11db0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11dc0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11dd0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11de0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11df0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e00 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e10 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e20 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11e30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11e40 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11e50 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11e70 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11e80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11e90 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11ea0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11eb0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11ed0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11ee0 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11ef0 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f00 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f10 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f20 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11f30 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11f40 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11f50 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11f60 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11f70 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11f80 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
11f90 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
11fa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11fb0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
11fc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
11fd0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
11fe0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
11ff0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12000 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12010 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12020 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12030 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12040 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12050 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12060 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12070 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12080 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12090 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
120a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
120b0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
120c0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
120d0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
120e0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
120f0 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12100 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12110 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12120 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12130 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12140 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12150 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12160 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12170 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12180 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12190 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
121a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
121b0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
121c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
121d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
121e0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
121f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12210 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12220 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12250 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
12260 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
12270 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
12280 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12290 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
122a0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
122b0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
122c0 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
122d0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
122e0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
122f0 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12300 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12310 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12320 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12330 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12340 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12350 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12360 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
12370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12390 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
123a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123b0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
123c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
123d0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
123e0 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
123f0 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12400 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12410 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12420 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12430 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12440 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12450 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
12460 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
12470 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
12480 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12490 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
124a0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
124b0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
124c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
124d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
124e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
124f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12500 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12510 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12520 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12530 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12540 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12550 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12560 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12580 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12590 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
125a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
125b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
125c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
125d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
125e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
125f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12610 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12620 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12630 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12640 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12660 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12670 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12680 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12690 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
126b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
126d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
126e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
126f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12700 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12710 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12720 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12730 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12740 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12750 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12760 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12770 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12780 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
127a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
127b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
127c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
127d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
127e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
127f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12800 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12810 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12830 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12840 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12850 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12860 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12870 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12880 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
128a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
128b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
128c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
128d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
128e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
128f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12900 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12910 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12920 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12930 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12940 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12950 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12960 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12970 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12980 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
129a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
129b0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
129c0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
129d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
129e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
129f0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12a00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12a10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12a20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12a30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12a40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12a50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12a60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12a70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12a80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12a90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12aa0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12ab0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12ad0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12ae0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12af0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12b00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12b10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12b20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12b30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12b40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12b50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12b60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12b70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12b80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12b90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ba0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12bb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12bc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12bd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12be0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12bf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12c00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12c10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12c30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12c40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12c50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12c60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12c70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12c80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12c90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12ca0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12cb0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12cc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12cd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12ce0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12cf0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12d00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12d10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12d20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12d30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12d40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12d50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     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 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12d80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12d90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12da0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12db0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12dc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12dd0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12de0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12df0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12e00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12e10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12e20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12e30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12e40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12e50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12e60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12e70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12e80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12e90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12ea0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12eb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12ec0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12ed0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12ee0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ef0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
12f00 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
12f10 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
12f20 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
12f30 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
12f40 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
12f50 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
12f60 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
12f70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
12f80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
12f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12fa0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
12fb0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
12fc0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
12fd0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
12fe0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
12ff0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13000 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13020 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13030 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13040 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13060 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13070 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13080 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
130a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
130b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
130c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
130d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
130e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
130f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13100 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13110 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13120 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13130 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13140 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13160 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13170 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13180 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13190 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
131a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
131b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
131c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
131d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
131e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
131f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13200 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13210 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13220 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13230 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13240 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13250 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13260 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13270 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13280 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13290 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
132a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
132b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
132c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
132d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
132e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
132f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13300 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13310 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13320 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13330 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13340 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13360 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13370 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13380 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13390 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
133a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
133b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
133c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
133d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
133e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
133f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13400 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13410 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13420 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13430 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13440 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13450 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13460 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13470 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13490 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
134a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
134b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
134c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
134d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
134e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
134f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13500 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13520 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13530 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13540 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13550 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13560 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13570 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13590 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
135a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
135b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
135c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
135d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
135e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
135f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13630 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13640 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13650 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13660 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13670 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13680 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
136a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
136b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
136c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
136d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
136e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
136f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13720 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13740 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13760 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13770 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13780 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13790 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
137a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
137b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
137d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
137e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
137f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13800 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13810 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13820 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13830 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13840 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13850 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13860 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13870 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13880 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
138a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
138c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
138d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
138e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
138f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13900 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13910 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13920 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13930 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13940 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13950 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13960 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13970 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13980 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13990 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
139a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
139b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
139c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
139d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
139e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
139f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13a10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13a20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13a30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13a40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13a50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13a70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13a80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13a90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13aa0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13ab0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13ac0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13ad0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13af0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13b00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13b10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
13b30 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13b40 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
13b50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
13b60 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
13b70 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
13b80 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
13b90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
13ba0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
13bb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
13bc0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
13bd0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61     PgHdr *p = pa
13be0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
13bf0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
13c00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
13c10 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
13c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13c30 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ef(p);.    }.  }
13c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
13c50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
13c60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13c70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
13c80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
13c90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
13ca0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
13cb0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
13cc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
13cd0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
13ce0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
13cf0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
13d00 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  Size);..  if( pa
13d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13d20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
13d30 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
13d40 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
13d50 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
13d60 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
13d70 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
13d80 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
13d90 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
13da0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
13db0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
13dc0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
13dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13de0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
13df0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
13e00 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
13e10 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
13e20 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
13e30 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
13e40 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
13e50 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
13e60 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
13e70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
13e80 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
13e90 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
13ea0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
13eb0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
13ec0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
13ed0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13ee0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
13ef0 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
13f00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
13f10 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
13f20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13f30 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
13f40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
13f50 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
13f60 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
13f70 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
13f80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
13f90 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
13fa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13fb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
13fc0 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
13fd0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
13fe0 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
13ff0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
14000 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
14010 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
14020 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14030 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
14040 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14050 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
14060 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
14070 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
14080 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
14090 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
140a0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
140b0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
140c0 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
140d0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
140e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
140f0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
14100 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
14110 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
14120 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
14130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
14140 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
14150 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
14160 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
14170 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14180 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
14190 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
141a0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
141b0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
141c0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
141d0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
141e0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
141f0 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
14200 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
14210 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
14220 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
14230 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
14240 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14260 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14270 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14280 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14290 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
142a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
142b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
142c0 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
142d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
142e0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
142f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14300 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14310 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14330 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14340 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14350 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14360 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14370 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14380 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14390 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
143a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
143b0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
143c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
143d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
143e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
143f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14400 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14410 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14420 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
14430 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
14440 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
14450 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
14460 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
14470 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
14480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14490 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
144a0 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
144b0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
144c0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
144d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
144e0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
144f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
14500 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
14510 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
14520 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
14530 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
14540 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
14550 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
14560 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
14570 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
14580 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
14590 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
145a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
145b0 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
145c0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
145d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
145e0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
145f0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
14600 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
14610 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14620 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
14630 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
14640 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
14650 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
14660 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
14670 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
14680 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
14690 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
146a0 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
146b0 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
146c0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
146d0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
146e0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
146f0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
14700 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
14710 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
14720 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
14730 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
14740 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
14750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
14760 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
14770 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
14780 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
14790 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
147a0 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
147b0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
147c0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
147d0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
147e0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
147f0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
14800 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
14810 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
14820 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
14830 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
14840 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
14850 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
14860 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
14870 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
14880 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
14890 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
148a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
148b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
148c0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
148d0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
148e0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
148f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
14900 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
14910 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
14920 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
14930 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
14940 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
14950 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
14960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
14970 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
14980 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
14990 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
149a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
149b0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
149c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
149d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
149e0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
149f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
14a20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
14a30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
14a40 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
14a50 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
14a60 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
14a70 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
14a80 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
14a90 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
14aa0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
14ab0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
14ac0 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
14ad0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
14ae0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14af0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
14b00 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
14b10 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
14b20 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
14b30 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
14b40 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
14b50 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
14b60 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
14b70 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
14b80 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
14b90 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
14ba0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
14bb0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
14bc0 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
14bd0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
14be0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
14bf0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
14c00 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
14c10 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
14c20 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
14c30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
14c40 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
14c50 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
14c60 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
14c70 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
14c80 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
14c90 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
14ca0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
14cc0 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
14cd0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
14ce0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
14cf0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
14d00 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
14d10 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
14d20 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
14d30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
14d40 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
14d50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14d60 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
14d70 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
14d80 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
14d90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
14da0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
14db0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
14dc0 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
14dd0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
14de0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
14df0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
14e00 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
14e10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14e20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14e30 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
14e40 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
14e50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14e60 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
14e70 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
14e80 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
14e90 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
14ea0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14eb0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
14ec0 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
14ed0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
14ee0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
14ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
14f00 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
14f10 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14f20 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14f30 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
14f40 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
14f50 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
14f60 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
14f70 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
14f80 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
14f90 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
14fa0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
14fb0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
14fc0 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
14fd0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
14fe0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
14ff0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
15000 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
15010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
15020 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
15030 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
15040 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
15050 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
15060 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
15070 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
15080 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
15090 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
150a0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
150b0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
150c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
150d0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
150e0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
150f0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
15100 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
15110 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
15120 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15130 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
15140 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
15150 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
15160 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
15170 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
15180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15190 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
151a0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
151b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
151c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
151d0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
151e0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
151f0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
15200 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
15210 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
15220 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
15230 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
15240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15250 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
15260 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
15270 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
15280 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
15290 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
152a0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
152b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
152c0 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
152f0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
15310 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
15340 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
15350 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
15360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15370 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15380 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
15390 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
153a0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
153d0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
153e0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
153f0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
15400 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
15410 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
15420 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
15430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
15440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15450 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
15460 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
15470 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
15480 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
154b0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
154c0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
154d0 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
154e0 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
154f0 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
15500 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
15510 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
15520 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
15530 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
15540 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
15550 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
15560 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
15570 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
15580 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
15590 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
155a0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
155b0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
155c0 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
155d0 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
155e0 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
155f0 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
15600 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
15610 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
15620 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
15630 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
15640 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
15650 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
15660 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
15670 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
15680 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
15690 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
156a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
156c0 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
156d0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
156e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
156f0 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
15700 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
15710 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
15720 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
15730 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
15740 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
15750 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
15760 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
15770 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
15780 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
15790 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
157a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
157b0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
157c0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
157d0 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
157e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
157f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15800 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15820 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
15830 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15840 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
15850 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15860 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
15870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15880 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15890 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
158a0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
158b0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
158c0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
158d0 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
158e0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
158f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
15900 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
15910 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
15920 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
15930 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
15940 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
15950 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
15960 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
15970 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
15980 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
15990 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
159a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
159d0 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
159e0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
159f0 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
15a00 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
15a10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a20 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
15a30 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
15a40 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
15a50 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
15a60 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
15a70 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
15a80 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
15a90 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
15aa0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
15ab0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
15ac0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
15ad0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
15ae0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
15af0 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
15b00 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
15b10 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
15b20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
15b30 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
15b40 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
15b50 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
15b60 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
15b70 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
15b80 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
15b90 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
15ba0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
15bb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
15bc0 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
15bd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15be0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
15bf0 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
15c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
15c10 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
15c20 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
15c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15c50 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
15c60 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
15c70 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
15c80 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
15c90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
15ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
15cb0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
15cc0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
15cd0 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
15ce0 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
15cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15d00 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15d10 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
15d20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15d30 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f  n played by befo
15d40 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
15d50 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
15d60 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
15d70 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
15d80 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
15d90 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
15da0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
15db0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
15dc0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
15dd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15de0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
15df0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
15e00 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
15e10 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
15e20 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
15e30 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
15e40 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
15e50 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
15e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
15e70 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
15e80 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
15e90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
15ea0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
15eb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
15ec0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
15ed0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
15ee0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
15ef0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
15f00 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
15f10 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
15f20 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
15f30 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
15f40 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
15f50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
15f60 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
15f70 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
15f80 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
15f90 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
15fa0 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
15fb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15fc0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
15fd0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
15fe0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
15ff0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
16000 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
16010 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
16020 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
16030 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
16040 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
16050 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
16060 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
16070 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
16080 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
16090 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
160a0 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
160b0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
160c0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
160d0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
160e0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
160f0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
16100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
16110 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
16120 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
16130 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
16140 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
16150 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
16160 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
16170 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
16180 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
16190 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
161a0 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
161b0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
161c0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
161d0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
161e0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
161f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
16200 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16210 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
16220 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
16230 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
16240 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
16250 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
16260 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
16270 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16280 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
16290 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
162a0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
162b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
162c0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
162d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
162e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
162f0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
16300 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
16310 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
16320 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
16330 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
16340 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
16350 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
16360 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
16370 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
16380 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
16390 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
163a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
163b0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
163c0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
163d0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
163e0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
163f0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
16400 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
16410 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
16420 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
16430 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
16440 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
16450 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
16460 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
16470 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
16480 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
16490 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
164a0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
164b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
164c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
164d0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
164e0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
164f0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
16500 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
16510 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
16520 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
16530 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
16540 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
16550 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
16560 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
16570 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
16580 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
16590 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
165a0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
165b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
165c0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
165d0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
165e0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
165f0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
16600 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
16610 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
16620 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
16630 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
16640 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
16650 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
16660 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
16670 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
16680 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
16690 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
166a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
166b0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
166c0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
166d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
166e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
166f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
16700 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16710 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
16720 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
16730 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
16740 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16750 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
16760 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
16770 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
16780 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
16790 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
167a0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
167b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
167c0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
167d0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
167e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
167f0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
16800 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
16810 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
16820 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
16830 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
16840 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
16850 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
16860 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
16870 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
16880 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
16890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
168a0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
168b0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
168c0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
168d0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
168e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
168f0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
16900 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16910 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
16920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
16930 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
16940 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
16950 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
16960 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
16980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
16990 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
169a0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
169b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
169c0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
169d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
169e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
169f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
16a00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
16a10 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
16a20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
16a30 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
16a40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
16a50 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
16a60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16a70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
16a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16a90 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
16aa0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16ab0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
16ac0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
16ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16ae0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
16af0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
16b00 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
16b10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
16b20 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16b30 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
16b40 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
16b50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16b60 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
16b70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
16b80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
16b90 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
16ba0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
16bb0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
16bc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16bd0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
16be0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
16bf0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
16c00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
16c10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
16c20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
16c30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
16c40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
16c50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
16c60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
16c70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
16c80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
16c90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
16ca0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
16cb0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
16cc0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
16cd0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
16ce0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
16cf0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
16d00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
16d10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
16d20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
16d30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
16d40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
16d50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
16d60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
16d70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
16d80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
16d90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
16da0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
16db0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16dc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
16dd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
16de0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
16df0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
16e00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
16e10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
16e20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
16e30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
16e40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
16e50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
16e60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
16e70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
16e80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
16e90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
16ea0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
16eb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
16ec0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
16ed0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
16ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16ef0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
16f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f10 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
16f20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
16f30 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
16f40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16f50 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
16f60 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
16f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16f80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
16f90 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
16fa0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
16fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fc0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16fd0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
16fe0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
16ff0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17000 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17010 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17020 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17030 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17040 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17050 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17060 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17070 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17080 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17090 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
170a0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
170b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
170c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
170d0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
170e0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
170f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17100 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17110 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17120 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17130 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17140 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17150 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17160 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17170 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17180 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17190 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
171a0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
171b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
171c0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
171d0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
171e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
171f0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17200 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17210 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17220 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17230 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17240 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17250 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17260 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17270 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17280 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17290 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
172a0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
172b0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
172d0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
172e0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
172f0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17300 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17310 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17320 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17330 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17340 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17350 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17360 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17370 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17380 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17390 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
173a0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
173b0 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
173c0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
173d0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
173e0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
173f0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17400 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17420 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17430 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17440 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17450 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17460 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17470 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17480 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17490 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
174a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
174b0 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
174c0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
174d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
174e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
174f0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17500 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17520 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17530 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17540 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17550 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17560 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17570 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17580 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17590 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
175a0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
175b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
175c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
175d0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
175e0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
175f0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17600 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17610 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17620 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17630 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17640 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17650 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17660 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17670 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17680 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17690 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
176a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
176b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
176c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
176d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
176e0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
176f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17700 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17710 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17720 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17730 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17740 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17750 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17760 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17770 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17780 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
177a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
177b0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
177c0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
177d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
177e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
177f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
17800 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
17810 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
17820 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17830 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17840 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17850 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
17860 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
17870 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
17880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17890 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
178a0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
178b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
178c0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
178d0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
178e0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
178f0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
17900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
17910 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
17920 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
17930 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
17940 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
17950 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
17960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17970 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
17980 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
17990 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
179a0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
179b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
179c0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
179d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
179e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
179f0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17a00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
17a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17a20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
17a30 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
17a40 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
17a50 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
17a60 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
17a70 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
17a80 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
17a90 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
17aa0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
17ab0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
17ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17ad0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
17ae0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
17af0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
17b00 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
17b10 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
17b30 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
17b40 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
17b50 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
17b60 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
17b70 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
17b80 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
17b90 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
17ba0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
17bb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17bc0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
17bd0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
17be0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
17bf0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
17c00 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
17c20 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
17c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17c40 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
17c50 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
17c60 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
17c70 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
17c80 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17c90 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
17ca0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
17cb0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
17cc0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
17ce0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
17cf0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
17d00 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
17d10 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
17d20 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
17d30 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
17d40 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
17d50 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
17d60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
17d70 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
17d80 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
17d90 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
17da0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17db0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
17dc0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
17dd0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
17de0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17df0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
17e00 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
17e10 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
17e20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
17e30 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
17e40 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
17e50 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
17e60 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17e70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
17e90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
17ea0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
17eb0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
17ec0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
17ed0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
17ee0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17ef0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
17f00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
17f10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
17f20 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
17f30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17f40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
17f50 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
17f60 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
17f70 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
17f80 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
17f90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
17fa0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17fb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
17fc0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
17fd0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
17fe0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
17ff0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18000 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18010 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18020 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18030 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18040 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18070 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18080 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
180a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
180b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
180c0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
180d0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
180f0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18100 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18110 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18120 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18140 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18150 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18160 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18170 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18180 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18190 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
181a0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
181b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
181c0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
181d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
181e0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
181f0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18200 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18210 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18220 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18230 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18240 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18260 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18270 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18280 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18290 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
182a0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
182b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
182c0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
182d0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
182e0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
182f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18300 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18320 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18330 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18350 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18360 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18370 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18380 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18390 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
183a0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
183b0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
183c0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
183d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
183e0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
183f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18400 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18410 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18420 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18440 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18450 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18460 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18480 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18490 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
184a0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
184b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
184c0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
184d0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
184e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
184f0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18500 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18510 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18520 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18530 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18540 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18550 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18560 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18570 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18580 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18590 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
185a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
185b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
185c0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
185d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
185e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
185f0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18600 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18610 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18620 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18630 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18640 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18650 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18660 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18670 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18680 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18690 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
186a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
186b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
186c0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
186d0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
186e0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
186f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18700 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18710 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18720 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18730 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18740 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18750 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18760 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18780 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18790 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
187a0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
187b0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
187c0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
187d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
187e0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
187f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18800 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
18810 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
18820 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
18830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18850 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18870 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
18880 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
18890 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
188a0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
188b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
188c0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
188d0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
188e0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
188f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
18900 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
18910 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
18920 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
18930 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
18940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18950 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
18960 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18970 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18980 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18990 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
189a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
189b0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
189c0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
189d0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
189e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18a00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
18a20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
18a30 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
18a40 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
18a50 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
18a60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
18a70 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
18a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18aa0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
18ac0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
18ad0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
18ae0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
18af0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
18b00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18b10 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
18b20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
18b30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18b40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
18b50 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18b60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18b70 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
18b80 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
18b90 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
18ba0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
18bb0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18bc0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
18bd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
18be0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
18bf0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
18c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
18c10 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
18c20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
18c30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
18c40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
18c50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
18c60 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
18c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
18c80 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
18c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18cb0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
18cc0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
18cd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18ce0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
18cf0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
18d00 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18d10 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
18d20 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
18d30 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
18d40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
18d50 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
18d60 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
18d70 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
18d80 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
18d90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
18da0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
18db0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
18dc0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
18dd0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
18de0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18df0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
18e00 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
18e10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
18e20 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
18e30 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
18e40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
18e50 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
18e60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18e70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
18e80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
18e90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
18ea0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
18eb0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
18ec0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
18ed0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
18ee0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
18ef0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
18f00 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
18f10 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
18f20 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
18f30 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
18f40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
18f50 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
18f60 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
18f70 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
18f80 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
18f90 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
18fa0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
18fb0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
18fc0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
18fd0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
18fe0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
18ff0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19000 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19010 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19020 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19030 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19040 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19050 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19070 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19080 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19090 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
190a0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
190b0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
190c0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
190d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
190e0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
190f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19100 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
19110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19120 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19130 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19140 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19150 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19160 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19170 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
19180 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
19190 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
191a0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
191b0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
191c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
191d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
191e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
191f0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19200 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19210 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19220 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19230 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19240 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19250 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19260 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
19270 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
19280 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
19290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
192a0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
192b0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
192c0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
192d0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
192e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
192f0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19300 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19320 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
19330 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
19340 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
19350 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 70 50 61  set(pTmp, 0, pPa
19360 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19370 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
19380 75 72 72 65 6e 74 53 69 7a 65 3c 6e 65 77 53 69  urrentSize<newSi
19390 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
193a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
193b0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
193c0 70 54 6d 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  pTmp, pPager->pa
193d0 67 65 53 69 7a 65 2c 20 63 75 72 72 65 6e 74 53  geSize, currentS
193e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
193f0 63 75 72 72 65 6e 74 53 69 7a 65 20 2b 3d 20 70  currentSize += p
19400 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19420 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19440 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19450 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
19460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
19490 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
194a0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
194b0 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
194c0 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
194d0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
194e0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
194f0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
19500 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
19510 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
19520 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
19530 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
19540 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
19550 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
19560 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
19570 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19580 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
19590 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
195a0 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
195b0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
195c0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
195d0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
195e0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
195f0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
19600 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
19610 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
19620 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
19630 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19640 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
19650 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19660 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
19670 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
19680 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
19690 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
196a0 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
196b0 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
196c0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
196d0 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
196e0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
196f0 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  R_SIZE..*/.stati
19700 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
19710 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
19720 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
19730 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19740 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
19750 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
19760 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
19770 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
19780 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
19790 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
197a0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
197b0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
197c0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
197d0 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
197e0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
197f0 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
19800 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
19810 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
19820 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
19830 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
19840 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
19850 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
19860 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19870 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a  ectorSize<32 ){.
19880 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19890 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
198a0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
198b0 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
198c0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
198d0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
198e0 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
198f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
19900 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
19910 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
19920 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
19930 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
19940 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
19950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19960 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
19970 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
19980 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
19990 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
199a0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
199b0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
199c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
199d0 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
199e0 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
199f0 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
19a00 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
19a10 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19a20 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19a30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
19a40 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
19a50 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
19a60 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
19a70 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
19a80 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
19a90 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
19aa0 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
19ab0 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
19ac0 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
19ad0 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
19ae0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19af0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19b00 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
19b10 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
19b20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
19b30 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
19b40 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19b50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19b60 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
19b70 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
19b80 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
19b90 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
19ba0 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
19bb0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19bc0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
19bd0 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
19be0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
19bf0 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
19c00 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
19c10 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
19c20 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
19c30 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
19c40 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
19c50 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
19c60 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
19c70 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
19c80 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
19c90 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
19ca0 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
19cb0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
19cc0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
19cd0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
19ce0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19cf0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
19d00 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
19d10 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
19d20 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
19d30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19d40 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
19d50 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
19d60 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
19d70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
19d80 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
19d90 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
19da0 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
19db0 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
19dc0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
19dd0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
19de0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19df0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
19e00 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
19e10 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
19e20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
19e30 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
19e40 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
19e50 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
19e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
19e70 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
19e80 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
19e90 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
19ea0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
19eb0 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
19ec0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
19ed0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
19ee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19ef0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
19f00 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
19f10 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
19f20 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
19f30 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
19f40 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
19f50 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
19f60 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
19f70 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
19f80 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
19f90 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
19fa0 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
19fb0 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
19fc0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
19fd0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
19fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
19ff0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1a000 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1a010 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1a020 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1a030 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1a040 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1a050 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1a060 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1a070 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1a080 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1a090 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1a0a0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1a0b0 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1a0c0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1a0d0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1a0e0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1a0f0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1a100 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1a110 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1a120 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1a130 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1a140 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1a150 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1a160 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1a170 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1a180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1a190 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1a1a0 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1a1b0 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1a1c0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1a1d0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1a1e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1a1f0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1a200 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1a210 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1a220 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1a230 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1a240 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1a250 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1a260 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1a270 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1a280 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1a290 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1a2a0 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1a2b0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1a2c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1a2d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1a2e0 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1a2f0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1a300 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1a310 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1a320 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1a330 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1a340 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1a350 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1a360 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1a370 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1a380 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1a390 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1a3a0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1a3b0 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1a3c0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1a3d0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1a3e0 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1a3f0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1a400 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1a410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a420 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1a430 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1a440 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1a450 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1a460 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1a470 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1a480 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1a490 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1a4a0 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a4d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1a4e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1a4f0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1a500 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a510 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1a520 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1a530 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1a540 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1a550 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1a560 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1a570 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1a580 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1a590 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1a5a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1a5d0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1a5e0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1a5f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a600 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1a610 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1a620 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1a630 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1a640 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1a650 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a660 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1a670 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1a680 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1a690 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1a6a0 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1a6b0 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
1a6c0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a6d0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1a6e0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1a6f0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1a700 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1a710 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1a720 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1a730 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1a740 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1a750 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1a760 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1a770 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1a790 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1a7a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
1a7b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a7c0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
1a7d0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
1a7e0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
1a7f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1a800 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
1a810 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
1a820 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
1a830 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
1a840 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
1a850 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
1a860 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
1a870 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
1a880 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
1a890 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
1a8a0 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
1a8b0 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
1a8c0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
1a8d0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
1a8e0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
1a8f0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
1a900 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
1a910 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
1a920 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
1a930 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
1a940 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1a950 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
1a960 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
1a970 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1a980 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1a990 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1a9a0 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1a9b0 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1a9c0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1a9d0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1a9e0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1a9f0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1aa00 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1aa10 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1aa20 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1aa30 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1aa40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1aa50 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1aa60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1aa70 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1aa80 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1aa90 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1aaa0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1aab0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1aac0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1aad0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1aae0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1aaf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ab00 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1ab10 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1ab20 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1ab30 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1ab40 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1ab50 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1ab60 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1ab70 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1ab80 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1ab90 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1aba0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1abb0 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1abc0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1abd0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1abe0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1abf0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1ac00 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1ac10 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1ac20 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1ac30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1ac40 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1ac50 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1ac60 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1ac70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1ac80 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1ac90 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1aca0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1acb0 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1acc0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1acd0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1ace0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1acf0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1ad00 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1ad10 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1ad20 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1ad30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1ad40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ad50 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1ad60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ad70 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1ad80 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1ad90 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1ada0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1adb0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1adc0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1add0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1ade0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1adf0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1ae00 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1ae10 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1ae20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1ae30 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1ae40 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1ae50 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1ae60 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1ae70 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1ae80 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1ae90 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1aea0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1aeb0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1aec0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1aed0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1aee0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1aef0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1af00 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1af10 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1af20 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1af30 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1af40 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1af50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1af60 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1af70 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1af80 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1af90 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1afa0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1afb0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1afc0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1afd0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1afe0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1aff0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1b000 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1b010 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1b020 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1b030 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1b040 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1b050 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1b060 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b070 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1b080 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1b090 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1b0a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1b0b0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1b0c0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1b0d0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1b0e0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1b0f0 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1b100 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1b110 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1b120 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1b130 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1b140 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1b150 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1b160 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1b170 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1b180 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1b190 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1b1a0 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1b1b0 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1b1c0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1b1d0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1b1e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1b1f0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1b200 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1b210 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1b220 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1b230 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1b240 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b250 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1b260 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1b270 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1b280 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1b290 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1b2a0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1b2b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b2c0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1b2d0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1b2e0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1b2f0 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1b300 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b310 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1b320 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1b330 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1b340 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b350 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1b360 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1b370 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1b380 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1b390 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b3a0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1b3b0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1b3c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1b3d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1b3e0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1b3f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1b400 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1b410 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1b420 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1b430 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b440 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1b450 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1b460 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1b470 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1b480 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1b490 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1b4a0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1b4b0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1b4c0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1b4d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1b4e0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1b4f0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1b500 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1b510 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1b520 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1b530 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1b540 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b550 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1b560 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1b570 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1b580 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1b590 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1b5a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1b5b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1b5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b5d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b5e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1b5f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b600 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1b610 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b620 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1b630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1b650 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1b660 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1b670 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1b680 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1b690 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1b6a0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1b6b0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1b6c0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1b6d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1b6e0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1b6f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1b700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1b710 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1b720 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1b730 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1b740 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1b750 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1b760 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1b770 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1b780 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1b790 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1b7a0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1b7b0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1b7c0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1b7d0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1b7e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1b800 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b810 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b820 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1b830 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1b840 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1b850 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1b860 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1b870 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1b880 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1b890 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1b8a0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1b8b0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1b8c0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1b8d0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1b8e0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1b8f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1b900 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1b910 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1b920 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1b930 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1b940 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1b950 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b960 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1b970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b980 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1b990 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1b9a0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1b9b0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1b9c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1b9d0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1b9e0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1b9f0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1ba00 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1ba10 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1ba20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1ba30 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1ba40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1ba50 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1ba60 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1ba70 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1ba80 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1ba90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1baa0 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1bab0 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fied..  */.  ass
1bac0 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d  ert(.    pPager-
1bad0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30  >fd->pMethods==0
1bae0 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ||.    sqlite3O
1baf0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
1bb00 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1bb10 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1bb20 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a  D,0)>=SQLITE_OK.
1bb30 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
1bb40 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1bb50 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1bb60 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1bb70 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1bb80 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1bb90 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1bba0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1bbb0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1bbc0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1bbd0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1bbe0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1bbf0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1bc00 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1bc10 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1bc20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1bc30 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1bc40 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1bc50 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1bc60 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1bc70 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1bc80 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1bc90 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1bca0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1bcb0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1bcc0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1bcd0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1bce0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1bcf0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1bd00 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1bd10 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1bd20 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1bd30 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1bd40 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1bd50 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1bd60 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1bd70 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1bd80 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1bd90 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1bda0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1bdb0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1bdc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1bdd0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1bde0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1bdf0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1be00 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1be10 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1be20 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1be30 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1be40 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1be50 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1be60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1be70 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1be80 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1be90 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1bea0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1beb0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1bec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bed0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1bee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1bef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bf00 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1bf10 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1bf20 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1bf30 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
1bf40 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1bf50 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1bf60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bf70 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1bf80 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1bf90 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1bfa0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1bfb0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1bfc0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1bfd0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1bfe0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1bff0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1c000 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1c010 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1c020 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1c030 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1c040 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1c050 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1c060 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
1c070 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1c080 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
1c090 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
1c0a0 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
1c0b0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
1c0c0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1c0d0 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
1c0e0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
1c0f0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
1c100 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
1c110 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
1c120 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
1c130 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1c140 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1c150 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c160 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1c170 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
1c180 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1c190 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20  e file and into 
1c1a0 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20  .** pPg->pData. 
1c1b0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72  A shared lock or
1c1c0 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
1c1d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1c1e0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65  abase.** file be
1c1f0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1c200 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
1c210 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73  .** If page 1 is
1c220 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20   read, then the 
1c230 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
1c240 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73  bFileVers[] is s
1c250 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c  et to.** the val
1c260 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
1c270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1c280 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
1c290 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1c2a0 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69  n the IO error i
1c2b0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1c2c0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68  e caller..** Oth
1c2d0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1c2e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
1c2f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1c300 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70  dDbPage(PgHdr *p
1c310 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1c320 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c330 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1c340 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1c350 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1c360 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1c370 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1c380 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1c390 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1c3a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1c3b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c3c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1c3d0 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20  isInWal = 0;    
1c3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c3f0 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c   if page is in l
1c400 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  og file */.  int
1c410 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1c420 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1c430 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1c440 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1c450 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1c460 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1c470 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1c480 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c490 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
1c4a0 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65  if( NEVER(!isOpe
1c4b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
1c4c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c4d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c4e0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  ;.    memset(pPg
1c4f0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
1c500 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c520 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
1c530 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1c540 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  er) ){.    /* Tr
1c550 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61  y to pull the pa
1c560 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74  ge from the writ
1c570 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a  e-ahead log. */.
1c580 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c590 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e  WalRead(pPager->
1c5a0 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49  pWal, pgno, &isI
1c5b0 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d  nWal, pgsz, pPg-
1c5c0 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69  >pData);.  }.  i
1c5d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c5e0 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a   && !isInWal ){.
1c5f0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1c600 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1c610 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c620 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1c630 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1c640 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1c650 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1c660 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c670 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1c680 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1c690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c6a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1c6b0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1c6c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1c6d0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1c6e0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1c6f0 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1c700 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1c710 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1c720 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1c730 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1c740 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1c750 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1c760 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1c770 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1c780 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1c790 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1c7a0 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1c7b0 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1c7c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1c7d0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1c7e0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1c7f0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1c800 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1c810 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1c820 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1c830 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1c840 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c850 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1c860 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1c870 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1c880 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1c890 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1c8a0 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1c8b0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1c8c0 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1c8d0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1c8e0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1c8f0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1c900 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1c910 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1c920 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
1c930 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1c940 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1c950 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1c960 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1c970 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1c980 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1c990 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1c9a0 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1c9b0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1c9c0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1c9d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1c9e0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1c9f0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1ca00 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1ca10 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1ca20 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1ca30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1ca40 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1ca50 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1ca60 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1ca70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1ca80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1ca90 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1caa0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1cab0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1cac0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1cad0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1cae0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1caf0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1cb00 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1cb10 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1cb20 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1cb30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1cb40 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1cb50 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1cb60 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1cb70 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1cb80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1cb90 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1cba0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1cbb0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1cbc0 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1cbd0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1cbe0 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1cbf0 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1cc00 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1cc10 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1cc20 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1cc30 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1cc40 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1cc50 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1cc60 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1cc70 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1cc80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1cc90 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1cca0 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1ccb0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1ccc0 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1ccd0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1cce0 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1ccf0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1cd00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1cd10 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1cd20 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1cd30 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1cd40 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1cd50 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1cd60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1cd70 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1cd80 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1cd90 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1cda0 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1cdb0 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1cdc0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1cdd0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1cde0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1cdf0 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1ce00 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1ce10 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1ce20 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1ce30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ce40 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1ce50 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1ce60 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1ce70 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1ce80 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1ce90 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1cea0 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1ceb0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1cec0 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1ced0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cee0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1cef0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cf00 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1cf10 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
1cf20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cf30 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1cf40 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1cf50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cf60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1cf70 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ef(pPg);.    }. 
1cf80 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1cf90 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1cfa0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1cfb0 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1cfc0 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1cfd0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1cfe0 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1cff0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1d000 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1d010 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1d020 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1d030 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1d040 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1d050 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1d060 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1d070 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1d080 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1d090 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1d0a0 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1d0b0 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1d0c0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d0d0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1d0e0 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1d0f0 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1d100 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1d110 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1d120 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1d130 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1d140 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1d150 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1d160 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1d170 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1d180 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1d190 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d1a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d1b0 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1d1c0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1d1d0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1d1e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1d1f0 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1d200 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1d210 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d230 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1d240 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1d250 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1d260 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1d270 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1d280 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1d290 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1d2a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1d2b0 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1d2c0 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1d2d0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1d2e0 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1d2f0 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1d300 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1d310 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1d320 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1d330 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1d340 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1d350 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1d360 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1d370 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1d380 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1d390 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1d3a0 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1d3b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1d3c0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1d3d0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1d3e0 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1d3f0 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1d400 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1d410 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1d420 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1d430 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1d440 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1d450 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1d460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d470 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1d480 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1d490 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1d4a0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1d4b0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1d4c0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1d4d0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1d4e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d4f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  ;.}.../*.** Upda
1d500 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1d510 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d520 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1d530 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1d540 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1d550 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1d560 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1d570 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1d580 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1d590 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1d5a0 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1d5b0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1d5c0 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1d5d0 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1d5e0 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1d5f0 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1d600 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1d610 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1d620 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1d630 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1d640 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1d650 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1d660 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1d670 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1d680 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1d690 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1d6a0 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1d6b0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1d6c0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1d6d0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1d6e0 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1d6f0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1d700 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1d710 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1d720 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1d730 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1d740 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1d750 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1d760 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1d770 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1d780 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1d790 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1d7a0 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1d7b0 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1d7c0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1d7d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1d7e0 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1d7f0 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1d800 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1d810 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1d820 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1d830 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1d840 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1d850 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1d860 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1d870 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d880 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1d890 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1d8a0 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1d8b0 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1d8c0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1d8d0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1d8e0 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1d8f0 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1d900 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1d910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1d920 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1d930 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1d940 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1d950 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1d960 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73  d..**.** The lis
1d970 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65  t of pages passe
1d980 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
1d990 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f  ine is always so
1d9a0 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d  rted by page num
1d9b0 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69  ber..** Hence, i
1d9c0 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73  f page 1 appears
1d9d0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1d9e0 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62   list, it will b
1d9f0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1da00 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
1da10 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
1da20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1da30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1da40 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1da50 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
1da60 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
1da70 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1da80 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
1da90 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
1daa0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1dab0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1dac0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
1dad0 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
1dae0 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20  t isCommit,     
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db00 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1db10 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69   a commit */.  i
1db20 6e 74 20 73 79 6e 63 46 6c 61 67 73 20 20 20 20  nt syncFlags    
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db40 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
1db50 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20  to OsSync() (or 
1db60 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  0) */.){.  int r
1db70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1db80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1db90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23 69 66  turn code */.#if
1dba0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1dbb0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1dbc0 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  d(SQLITE_CHECK_P
1dbd0 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70  AGES).  PgHdr *p
1dbe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dbf0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1dc00 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1dc10 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  s */.#endif..  a
1dc20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1dc30 57 61 6c 20 29 3b 0a 23 69 66 64 65 66 20 53 51  Wal );.#ifdef SQ
1dc40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1dc50 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1dc60 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1dc70 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1dc80 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1dc90 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1dca0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1dcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1dcc0 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1dcd0 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1dce0 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  dif..  if( pList
1dcf0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1dd00 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1dd10 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1dd20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1dd30 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1dd40 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1dd50 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1dd60 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1dd70 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 46 6c 61  sCommit, syncFla
1dd80 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1dd90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1dda0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1ddb0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1ddc0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1ddd0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1dde0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1ddf0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1de00 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1de10 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1de20 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1de30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1de40 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 66 6f  CHECK_PAGES.  fo
1de50 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1de60 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1de70 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
1de80 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
1de90 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
1dea0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1deb0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1dec0 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1ded0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1dee0 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
1def0 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
1df00 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
1df10 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
1df20 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
1df30 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
1df40 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
1df50 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
1df60 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
1df70 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
1df80 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
1df90 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
1dfa0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
1dfb0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
1dfc0 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
1dfd0 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
1dfe0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1dff0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1e000 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
1e010 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e040 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
1e050 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
1e060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e070 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
1e080 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
1e090 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1e0a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1e0b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e0c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1e0d0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
1e0e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
1e0f0 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
1e100 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1e110 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
1e120 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
1e130 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
1e140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1e150 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
1e160 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
1e170 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
1e180 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
1e190 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
1e1a0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
1e1b0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
1e1c0 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
1e1d0 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
1e1e0 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
1e1f0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1e200 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1e210 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1e220 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
1e230 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1e240 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1e250 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
1e260 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e270 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
1e280 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1e290 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
1e2a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1e2b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
1e2c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e2d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1e2e0 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1e2f0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1e300 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1e310 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1e320 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1e330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1e340 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1e350 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1e360 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1e370 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1e380 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1e390 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1e3a0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1e3b0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1e3c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e3d0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1e3e0 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1e3f0 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1e400 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1e410 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1e420 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1e430 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1e440 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1e450 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1e460 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e470 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1e480 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1e490 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1e4a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1e4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1e4c0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1e4d0 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1e4e0 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1e4f0 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1e500 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e510 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1e520 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
1e530 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
1e540 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
1e550 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
1e560 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
1e570 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1e580 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
1e590 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
1e5a0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1e5b0 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
1e5c0 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1e5d0 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
1e5e0 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
1e5f0 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
1e600 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
1e610 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
1e620 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
1e630 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1e640 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1e650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e660 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1e670 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
1e680 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20  >noReadlock );. 
1e690 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
1e6a0 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1e6b0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
1e6c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1e6d0 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69  ize was not avai
1e6e0 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1e6f0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20  AL sub-system,. 
1e700 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74   ** determine it
1e710 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
1e720 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e730 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
1e740 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
1e750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1e760 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
1e770 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1e780 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a   page-size,.  **
1e790 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74   round down to t
1e7a0 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e  he nearest page.
1e7b0 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
1e7c0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a  e larger than 0.
1e7d0 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1e7e0 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
1e7f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c   to contain at l
1e800 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20  east one page.. 
1e810 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
1e820 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  =0 ){.    i64 n 
1e830 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1e840 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e850 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
1e860 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  tes */.    asser
1e870 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1e880 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1e890 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1e8a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1e8b0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1e8c0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1e8d0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1e8e0 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
1e8f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e920 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61   }.    }.    nPa
1e930 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20  ge = (Pgno)(n / 
1e940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e950 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  );.    if( nPage
1e960 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20  ==0 && n>0 ){.  
1e970 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1e980 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1e990 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1e9a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1e9b0 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1e9c0 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1e9d0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1e9e0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1e9f0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1ea00 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1ea10 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1ea20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1ea30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1ea40 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1ea50 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1ea60 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1ea70 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1ea80 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1ea90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eaa0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1eab0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1eac0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1ead0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1eae0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1eaf0 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1eb00 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1eb10 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1eb20 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1eb30 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1eb40 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1eb50 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1eb60 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1eb70 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1eb80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1eb90 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1eba0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1ebb0 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1ebc0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1ebd0 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1ebe0 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1ebf0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1ec00 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1ec10 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1ec20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1ec30 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1ec40 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1ec50 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1ec60 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1ec70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1ec80 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1ec90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1eca0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1ecb0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1ecc0 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1ecd0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1ece0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1ecf0 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1ed00 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1ed10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1ed20 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1ed30 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1ed40 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1ed50 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1ed60 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1ed70 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1ed80 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1ed90 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1eda0 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1edb0 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1edc0 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1edd0 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1ede0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1edf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ee00 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1ee10 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1ee20 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1ee30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1ee40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1ee50 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1ee60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ee70 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1ee80 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  D_LOCK || pPager
1ee90 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
1eea0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1eeb0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1eec0 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eee0 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
1eef0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
1ef00 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
1ef30 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1ef40 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
1ef50 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1ef60 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
1ef70 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ef80 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1ef90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1efa0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1efb0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1efc0 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
1efd0 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
1efe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1f000 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
1f010 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
1f020 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
1f030 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1f040 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
1f050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f070 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
1f080 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
1f090 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
1f0a0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
1f0b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
1f0c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1f0d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1f0e0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
1f0f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f100 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f110 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1f120 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
1f130 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f140 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
1f150 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f160 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
1f170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f180 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f190 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1f1a0 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
1f1b0 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
1f1c0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
1f1d0 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
1f1e0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
1f1f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1f200 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
1f210 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
1f220 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
1f230 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
1f240 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
1f250 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
1f260 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1f270 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
1f280 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
1f290 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
1f2a0 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
1f2b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1f2c0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
1f2d0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
1f2e0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
1f2f0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
1f300 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
1f310 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
1f320 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
1f330 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
1f340 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
1f350 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1f360 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1f370 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
1f380 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
1f390 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1f3a0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1f3b0 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
1f3c0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1f3d0 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
1f3e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f3f0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
1f400 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
1f410 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f420 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
1f430 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
1f440 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f450 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
1f460 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1f470 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
1f480 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
1f490 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1f4a0 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
1f4b0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
1f4c0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
1f4d0 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
1f4e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f4f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
1f500 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1f510 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
1f520 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
1f530 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
1f540 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
1f550 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
1f560 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
1f570 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1f580 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
1f590 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
1f5a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
1f5b0 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
1f5c0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
1f5d0 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
1f5e0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
1f5f0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1f600 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
1f610 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
1f620 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
1f630 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
1f640 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
1f650 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
1f660 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1f670 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
1f680 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1f690 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1f6a0 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1f6b0 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
1f6c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
1f6d0 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
1f6e0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1f6f0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
1f700 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
1f710 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1f720 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1f730 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
1f740 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1f750 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
1f760 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
1f770 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
1f780 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
1f790 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
1f7a0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
1f7b0 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
1f7c0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1f7d0 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
1f7e0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
1f7f0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
1f800 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
1f810 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
1f820 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
1f830 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
1f840 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
1f850 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
1f860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f870 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
1f880 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
1f890 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
1f8a0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
1f8b0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f8d0 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
1f8e0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1f8f0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
1f900 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
1f910 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
1f920 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
1f930 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
1f940 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
1f950 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1f960 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1f970 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
1f980 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1f990 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
1f9a0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
1f9b0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
1f9c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f9d0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1f9e0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1f9f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fa00 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1fa10 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
1fa20 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
1fa30 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
1fa40 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
1fa50 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
1fa60 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
1fa70 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
1fa80 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1fa90 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
1faa0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
1fab0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
1fac0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fad0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1fae0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1faf0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
1fb00 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
1fb10 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
1fb20 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
1fb30 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
1fb40 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
1fb50 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1fb60 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
1fb70 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
1fb80 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
1fb90 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
1fba0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1fbb0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1fbc0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
1fbd0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
1fbe0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1fbf0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1fc00 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1fc10 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
1fc20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
1fc30 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
1fc40 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
1fc50 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
1fc60 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
1fc70 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
1fc80 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
1fc90 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
1fca0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
1fcb0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1fcc0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
1fcd0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
1fce0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
1fcf0 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
1fd00 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
1fd10 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
1fd20 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
1fd30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1fd40 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1fd50 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
1fd60 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
1fd70 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
1fd80 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
1fd90 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
1fda0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
1fdb0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
1fdc0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
1fdd0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1fde0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
1fdf0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
1fe00 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
1fe10 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
1fe20 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
1fe30 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
1fe40 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
1fe50 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1fe60 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
1fe70 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
1fe80 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
1fe90 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
1fea0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
1feb0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
1fec0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
1fed0 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
1fee0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
1fef0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
1ff00 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
1ff10 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
1ff20 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
1ff30 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
1ff40 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
1ff50 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
1ff60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ff70 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
1ff80 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
1ff90 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1ffa0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
1ffb0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
1ffc0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1ffd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1ffe0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
1fff0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
20000 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
20010 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20020 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20030 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
20040 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20050 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
20060 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
20070 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
20080 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
20090 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
200a0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
200b0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
200c0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
200d0 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
200e0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
200f0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
20100 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
20110 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
20120 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
20130 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
20140 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
20150 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20160 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
20170 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
20180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
20190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
201a0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
201b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
201c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
201d0 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
201e0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
201f0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
20200 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
20210 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
20220 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
20230 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
20240 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
20250 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20260 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
20270 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
20280 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
20290 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
202a0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
202b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
202c0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
202d0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
202e0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
202f0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
20300 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
20310 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
20320 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
20330 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
20340 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
20350 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
20360 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20370 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
20380 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
20390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
203a0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
203b0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
203c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203d0 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
203e0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
203f0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
20400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20410 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
20420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20430 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
20440 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20450 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20460 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20470 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20480 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20490 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
204a0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
204b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
204c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
204d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
204e0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
204f0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
20500 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
20510 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
20520 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
20530 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
20540 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
20550 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20560 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
20570 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
20580 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
20590 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
205a0 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
205b0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
205c0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
205d0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
205e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
205f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
20600 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
20610 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
20620 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20630 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
20640 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20650 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
20660 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
20670 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
20680 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
20690 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
206a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
206b0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
206c0 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
206d0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
206e0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
206f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
20700 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67  fset==ii*(4+pPag
20710 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
20720 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
20730 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
20740 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
20750 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
20760 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20770 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20780 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
20790 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
207a0 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
207b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
207c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
207d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
207e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
207f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
20800 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
20810 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
20820 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
20830 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
20840 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
20850 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
20860 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
20870 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
20880 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
20890 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
208a0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
208b0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
208c0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
208d0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
208e0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
208f0 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
20900 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
20910 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
20920 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
20930 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
20940 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20950 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
20960 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
20970 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
20980 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
20990 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
209a0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
209b0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
209c0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
209d0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
209e0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
209f0 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
20a00 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
20a10 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
20a20 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
20a30 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
20a40 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
20a50 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
20a60 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
20a70 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
20a80 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
20a90 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
20aa0 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
20ab0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
20ad0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
20ae0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
20af0 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
20b00 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
20b10 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
20b20 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
20b30 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
20b40 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
20b50 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
20b60 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
20b70 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
20b80 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
20b90 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
20ba0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
20bb0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
20bd0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
20be0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
20bf0 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
20c00 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
20c10 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
20c20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
20c30 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
20c40 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
20c50 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
20c60 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
20c70 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
20c80 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
20c90 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
20ca0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
20cb0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
20cc0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
20ce0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
20cf0 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
20d00 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
20d10 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
20d20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
20d30 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
20d40 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
20d50 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
20d60 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
20d70 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
20d80 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
20d90 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
20da0 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
20db0 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
20dc0 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
20dd0 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
20de0 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
20df0 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
20e00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
20e10 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
20e20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
20e30 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
20e40 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
20e50 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
20e60 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
20e70 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
20e80 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
20e90 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
20ea0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
20eb0 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
20ec0 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
20ed0 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
20ee0 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
20ef0 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
20f00 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
20f10 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
20f20 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
20f30 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
20f40 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
20f50 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
20f60 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
20f70 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
20f80 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
20f90 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
20fa0 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
20fb0 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
20fc0 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
20fd0 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
20fe0 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
20ff0 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
21000 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
21010 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
21020 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21030 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
21040 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
21050 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
21060 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
21070 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
21080 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
21090 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
210a0 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
210b0 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
210c0 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
210d0 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
210e0 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
210f0 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
21100 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
21110 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
21120 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
21130 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
21140 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
21150 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
21160 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
21170 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21180 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
21190 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
211a0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
211b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
211c0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
211d0 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
211e0 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
211f0 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a  Level(.  Pager *
21200 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
21210 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
21220 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
21230 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76  for */.  int lev
21240 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  el,            /
21250 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
21260 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
21270 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
21280 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46  /  .  int bFullF
21290 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50  sync,       /* P
212a0 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20  RAGMA fullfsync 
212b0 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75  */.  int bCkptFu
212c0 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52  llFsync    /* PR
212d0 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
212e0 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a  fullfsync */.){.
212f0 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
21300 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
21310 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
21320 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
21330 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
21340 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
21350 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
21360 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
21370 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
21380 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
21390 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
213a0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
213b0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
213c0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
213d0 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
213e0 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29  if( bFullFsync )
213f0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
21400 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
21410 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
21420 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21430 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21440 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
21450 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46  e if( bCkptFullF
21460 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
21470 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21480 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
21490 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
214a0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
214b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
214c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
214d0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
214e0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
214f0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21500 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21510 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21520 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ORMAL;.  }.}.#en
21530 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
21540 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
21550 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21560 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21570 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21580 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
21590 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
215a0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
215b0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
215c0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
215d0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
215e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
215f0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
21600 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21610 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
21620 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
21630 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
21640 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
21650 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
21660 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
21670 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21680 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
21690 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
216a0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
216b0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
216c0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
216d0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
216e0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
216f0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
21700 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
21710 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
21720 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
21730 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
21740 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
21750 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
21760 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
21770 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
21780 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21790 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
217a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
217b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
217c0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
217d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
217e0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
217f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
21800 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
21810 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
21820 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
21830 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
21840 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
21850 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
21860 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
21870 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
21880 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
21890 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
218a0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
218b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
218d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
218e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
218f0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
21900 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
21910 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
21920 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21930 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
21940 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
21950 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21960 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
21970 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
21980 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21990 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
219a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
219b0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
219c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
219d0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
219e0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
219f0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
21a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21a10 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
21a20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
21a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
21a40 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
21a50 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
21a60 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
21a70 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
21a80 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
21a90 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
21aa0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
21ab0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
21ac0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
21ad0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
21ae0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
21af0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
21b00 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
21b10 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
21b20 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
21b30 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
21b40 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
21b50 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
21b60 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
21b70 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
21b80 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
21b90 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
21ba0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
21bb0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
21bc0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
21bd0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
21be0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
21bf0 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
21c10 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
21c20 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
21c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c60 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
21c70 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
21c80 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
21c90 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
21ca0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
21cb0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
21cc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
21cd0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
21ce0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
21cf0 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
21d00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
21d10 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
21d20 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
21d30 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
21d40 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
21d50 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
21d60 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
21d70 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
21d80 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
21d90 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
21da0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
21db0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
21dc0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
21dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21de0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
21df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
21e20 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
21e30 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
21e40 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
21e50 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
21e60 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
21e70 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
21e80 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
21e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21ea0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
21eb0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
21ec0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
21ed0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
21ee0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
21ef0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
21f00 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
21f10 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
21f20 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21f30 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
21f40 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
21f50 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
21f60 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
21f70 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
21f80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
21f90 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
21fa0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
21fb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
21fc0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
21fd0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
21fe0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
21ff0 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
22000 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
22010 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
22020 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
22030 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
22040 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
22050 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
22060 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
22070 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
22080 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
22090 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
220a0 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
220b0 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
220c0 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
220d0 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
220e0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
220f0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
22100 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
22110 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
22120 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
22130 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
22140 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
22150 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
22160 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
22170 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
22180 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
22190 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
221a0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
221b0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
221c0 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
221d0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
221e0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
221f0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
22200 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
22210 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
22220 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
22230 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
22240 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
22250 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
22260 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
22270 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
22280 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
22290 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
222a0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
222b0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
222c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
222d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
222e0 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
222f0 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
22300 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
22310 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
22320 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22330 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
22340 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
22350 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
22360 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
22370 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
22380 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
22390 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
223a0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
223b0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
223c0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
223d0 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
223e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
223f0 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
22400 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
22410 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
22420 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
22430 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
22440 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
22450 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22460 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
22470 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
22480 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
22490 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
224a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
224b0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
224c0 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
224d0 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
224e0 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
224f0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
22500 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
22510 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
22520 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
22530 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
22540 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
22550 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
22560 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
22570 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
22580 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
22590 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
225a0 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
225b0 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
225c0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
225d0 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
225e0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
225f0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
22600 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
22610 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
22620 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
22630 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
22640 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
22650 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
22660 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
22670 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
22680 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
22690 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
226a0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
226b0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
226c0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
226d0 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
226e0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
226f0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
22700 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
22710 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
22720 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
22730 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
22740 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
22750 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
22760 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
22770 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
22780 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
22790 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
227a0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
227b0 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
227c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
227d0 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
227e0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
227f0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
22800 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
22810 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
22820 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
22830 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22850 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
22860 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
22870 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
22880 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
22890 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
228a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
228b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
228c0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
228d0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
228e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
228f0 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f   = (Pgno)(nByte/
22900 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22910 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22920 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
22930 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
22940 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
22950 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
22960 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
22970 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71  = pNew;.      sq
22980 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
22990 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
229a0 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
229b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
229c0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
229d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
229e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
229f0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
22a00 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
22a10 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
22a20 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
22a30 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
22a40 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
22a50 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
22a60 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
22a70 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
22a80 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
22a90 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
22aa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22ab0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22ac0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
22ad0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
22ae0 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
22af0 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
22b00 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
22b10 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
22b20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
22b30 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
22b40 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
22b50 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
22b60 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
22b70 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
22b80 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
22b90 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
22ba0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
22bb0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
22bc0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
22bd0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
22be0 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
22bf0 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
22c00 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
22c10 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
22c20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
22c30 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
22c40 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
22c50 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
22c60 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
22c70 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
22c80 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
22c90 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
22ca0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
22cb0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
22cc0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
22cd0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
22ce0 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
22cf0 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
22d00 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
22d10 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
22d20 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
22d30 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
22d40 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
22d50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
22d60 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
22d70 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
22d80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
22d90 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
22da0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
22db0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
22dc0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
22dd0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
22de0 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
22df0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
22e00 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
22e10 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
22e20 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
22e30 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
22e40 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
22e50 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
22e60 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
22e70 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
22e80 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
22e90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
22ea0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
22eb0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
22ec0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
22ed0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
22ee0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
22ef0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
22f00 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
22f10 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
22f20 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
22f30 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
22f40 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
22f50 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
22f60 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
22f70 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
22f80 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
22f90 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
22fa0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
22fb0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
22fc0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22fd0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
22fe0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
22ff0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
23000 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
23010 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
23020 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
23030 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
23040 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23050 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
23060 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
23070 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23080 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
23090 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
230a0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
230b0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
230c0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
230d0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
230e0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
230f0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
23100 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
23110 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23120 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
23130 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23140 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
23150 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
23160 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
23170 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
23180 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
23190 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
231a0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
231b0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
231c0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
231d0 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
231e0 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
231f0 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
23200 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
23210 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
23220 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
23230 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
23240 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
23250 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
23260 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
23270 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
23280 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
23290 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
232a0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
232b0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
232c0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
232d0 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
232e0 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
232f0 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
23300 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
23310 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
23320 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
23330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
23340 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
23350 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
23360 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23370 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
23380 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
23390 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
233a0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
233b0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
233c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
233d0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
233e0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
233f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
23400 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
23410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
23420 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
23430 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
23440 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23450 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
23460 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
23470 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
23480 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
23490 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
234a0 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
234b0 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
234c0 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
234d0 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
234e0 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
234f0 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
23500 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
23510 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
23520 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
23530 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
23540 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23550 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
23560 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
23570 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
23580 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
23590 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
235a0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
235b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
235c0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
235d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
235e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
235f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23610 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
23620 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
23630 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
23640 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
23650 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
23660 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
23670 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
23680 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23690 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
236a0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
236b0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
236c0 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
236d0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
236e0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
236f0 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
23700 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
23710 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
23720 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
23730 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
23740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23750 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
23760 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
23770 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23780 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
23790 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
237a0 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
237b0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
237c0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
237d0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
237e0 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
237f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23800 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
23810 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
23820 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
23830 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
23840 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
23850 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
23860 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
23870 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23880 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
23890 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
238a0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
238b0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
238c0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
238d0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
238e0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
238f0 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
23900 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
23910 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
23920 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
23930 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
23940 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
23950 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
23960 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
23970 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23980 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
23990 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
239a0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
239b0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
239c0 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
239d0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
239e0 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
239f0 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
23a00 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
23a10 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
23a20 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
23a30 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
23a40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23a50 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
23a60 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
23a90 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
23aa0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
23ab0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
23ac0 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
23ad0 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
23ae0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
23af0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
23b00 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
23b10 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
23b20 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
23b30 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
23b40 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
23b50 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
23b60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
23b70 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
23b80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
23b90 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
23ba0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
23bb0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
23bc0 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
23bd0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
23be0 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
23bf0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
23c00 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
23c10 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
23c20 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
23c30 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
23c40 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
23c50 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
23c60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23c70 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
23c80 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
23c90 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
23ca0 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
23cb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23cc0 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
23cd0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
23ce0 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
23cf0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
23d00 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
23d10 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
23d20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
23d30 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
23d40 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
23d50 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
23d60 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
23d70 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
23d80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
23d90 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
23da0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
23db0 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
23dc0 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
23dd0 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
23de0 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
23df0 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
23e00 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
23e10 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
23e20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
23e30 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
23e40 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
23e50 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
23e60 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
23e70 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
23e80 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
23e90 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
23ea0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
23eb0 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
23ec0 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
23ed0 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
23ee0 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
23ef0 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
23f00 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
23f10 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
23f20 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
23f30 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
23f40 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
23f50 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
23f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
23f70 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
23f80 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
23f90 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
23fa0 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
23fb0 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
23fc0 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
23fd0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
23fe0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
23ff0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
24000 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
24010 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
24020 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
24030 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
24040 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
24050 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
24060 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24070 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
24080 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
24090 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
240a0 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
240b0 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
240c0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
240d0 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
240e0 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
240f0 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
24100 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
24110 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
24120 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
24130 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24140 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
24150 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24160 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
24170 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
24180 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
24190 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
241a0 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
241b0 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
241c0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
241d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
241e0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
241f0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24200 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
24210 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
24220 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
24230 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
24240 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
24250 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
24260 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
24270 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
24280 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
24290 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
242a0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
242b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
242c0 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
242d0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
242e0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
242f0 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
24300 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
24310 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
24320 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
24330 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
24340 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
24350 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
24360 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
24370 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
24380 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
24390 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
243a0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
243b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
243c0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
243d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
243e0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
243f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24400 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
24410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24420 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
24430 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
24440 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
24450 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
24460 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24470 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
24480 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24490 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
244a0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
244b0 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
244c0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
244d0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
244e0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
244f0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
24500 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
24510 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
24520 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
24530 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
24540 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
24550 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
24560 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
24570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
24580 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
24590 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
245a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
245b0 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
245c0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
245d0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
245e0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
245f0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
24600 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
24610 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
24620 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
24630 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
24640 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
24650 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
24660 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
24670 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
24680 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
24690 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
246a0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
246b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
246c0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
246d0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
246e0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
246f0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
24700 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
24710 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
24720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24730 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
24740 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
24750 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
24760 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
24770 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
24780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
24790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
247a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
247b0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
247c0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
247d0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
247e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
247f0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
24800 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
24810 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
24820 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
24830 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
24840 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
24850 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
24860 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24870 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
24880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
24890 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
248a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
248b0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
248c0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
248d0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
248e0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
248f0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
24900 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
24910 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
24920 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
24930 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
24940 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
24950 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
24960 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24970 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
24980 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
24990 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
249a0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
249b0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
249c0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
249d0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
249e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
249f0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
24a00 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
24a10 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
24a20 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
24a30 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
24a40 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
24a50 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
24a60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24a70 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
24a80 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
24a90 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62  pSpace;..  disab
24aa0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24ab0 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
24ac0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
24ad0 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61  lloc();.  /* pPa
24ae0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
24af0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
24b00 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
24b10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24b20 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
24b30 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
24b40 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
24b50 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
24b60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
24b70 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
24b80 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
24b90 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
24ba0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
24bb0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
24bc0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
24bd0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
24be0 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
24bf0 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
24c00 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
24c10 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
24c20 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
24c30 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
24c40 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
24c50 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
24c60 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
24c70 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
24c80 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
24c90 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
24ca0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
24cb0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
24cc0 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
24cd0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
24ce0 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
24cf0 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
24d00 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
24d10 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
24d20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
24d30 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
24d40 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
24d50 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
24d60 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
24d70 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
24d80 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
24d90 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
24da0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
24db0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
24dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
24dd0 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
24de0 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
24df0 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
24e00 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
24e10 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
24e20 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
24e30 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
24e40 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
24e50 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
24e60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
24e70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
24e80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
24e90 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24ea0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
24eb0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
24ec0 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
24ed0 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
24ee0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
24ef0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
24f00 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
24f10 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
24f20 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24f30 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
24f40 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
24f50 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
24f60 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
24f70 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
24f80 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
24f90 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
24fa0 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
24fb0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
24fc0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
24fd0 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
24fe0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
24ff0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
25000 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
25010 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
25020 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
25030 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
25040 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
25050 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
25060 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
25070 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
25080 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
25090 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
250a0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
250b0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
250c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
250d0 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
250e0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
250f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25100 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
25110 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
25120 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
25130 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
25140 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
25150 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
25160 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
25170 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
25180 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
25190 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
251a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
251b0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
251c0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
251d0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
251e0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
251f0 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
25200 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
25210 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
25220 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
25230 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
25240 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
25250 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
25260 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
25270 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
25280 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
25290 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
252a0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
252b0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
252c0 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
252d0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
252e0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
252f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
25300 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
25310 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
25320 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25330 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
25340 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
25350 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
25360 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
25370 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
25380 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
25390 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
253a0 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
253b0 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
253c0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
253d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
253e0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
253f0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
25400 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
25410 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
25420 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
25430 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
25440 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
25450 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
25460 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
25470 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
25480 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
25490 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
254a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
254b0 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
254c0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
254d0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
254e0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
254f0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
25500 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
25510 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
25520 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
25530 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
25540 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
25550 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25560 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
25570 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
25580 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
25590 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
255a0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
255b0 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
255c0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
255d0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
255e0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
255f0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
25600 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
25610 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
25620 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
25630 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
25640 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
25650 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
25660 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
25670 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
25680 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
25690 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
256a0 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
256b0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
256c0 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
256d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
256e0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
256f0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
25700 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
25710 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
25720 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
25730 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
25740 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
25750 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
25760 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
25770 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
25780 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
25790 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
257a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
257b0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
257c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
257d0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
257e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
257f0 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
25800 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25820 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25830 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25840 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25850 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
25860 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
25870 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25880 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
25890 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
258a0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
258b0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
258c0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
258d0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
258e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
258f0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
25900 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
25910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25920 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
25930 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
25940 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
25950 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25960 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
25970 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
25980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25990 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
259a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
259b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
259c0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
259d0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
259e0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
259f0 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
25a00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25a10 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
25a20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
25a30 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25a40 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
25a50 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
25a60 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
25a70 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
25a80 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
25a90 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
25aa0 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
25ab0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
25ac0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
25ad0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
25ae0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
25af0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
25b00 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
25b10 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
25b20 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
25b30 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
25b40 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
25b50 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
25b60 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
25b70 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
25b80 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
25b90 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
25ba0 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
25bb0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
25bc0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
25bd0 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
25be0 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
25bf0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
25c00 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
25c10 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
25c20 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
25c30 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
25c40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
25c50 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
25c60 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
25c70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25c80 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
25c90 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
25ca0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
25cb0 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
25cc0 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
25cd0 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
25ce0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
25cf0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25d00 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
25d10 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
25d20 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
25d30 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
25d40 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
25d50 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
25d60 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
25d70 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
25d80 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
25d90 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
25da0 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
25db0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
25dc0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25dd0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
25de0 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
25df0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
25e00 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
25e10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
25e20 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
25e30 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
25e40 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
25e50 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
25e60 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
25e70 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
25e80 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
25e90 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
25ea0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
25eb0 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
25ec0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
25ed0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
25ee0 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
25ef0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
25f00 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
25f10 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
25f20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
25f30 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
25f40 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
25f50 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
25f60 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
25f70 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
25f80 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
25f90 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
25fa0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
25fb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25fc0 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
25fd0 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
25fe0 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
25ff0 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
26000 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26010 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
26020 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
26030 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
26040 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
26050 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
26060 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
26070 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
26080 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
26090 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
260a0 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
260b0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
260c0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
260d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
260e0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
260f0 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
26100 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
26110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
26120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
26130 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
26140 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
26150 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
26160 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
26170 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
26180 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26190 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
261a0 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
261b0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
261c0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
261d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
261e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
261f0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
26200 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
26210 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
26220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
26230 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
26240 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
26250 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26260 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
26270 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
26280 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
26290 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
262a0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
262b0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
262c0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
262d0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
262e0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
262f0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
26300 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
26310 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
26320 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
26330 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
26340 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
26350 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
26360 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
26370 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
26380 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
26390 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
263a0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
263b0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
263c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
263d0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
263e0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
263f0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
26400 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
26410 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
26420 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
26430 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
26440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
26450 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
26460 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
26470 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
26480 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
26490 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
264a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
264b0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
264c0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
264d0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
264e0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
264f0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
26500 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26510 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
26520 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
26530 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
26540 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
26550 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26560 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
26570 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
26580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
265a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
265b0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
265c0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
265d0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
265e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
265f0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
26600 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
26610 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
26620 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
26630 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
26640 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
26650 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
26660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26690 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
266a0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
266b0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
266c0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
266d0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
266e0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
266f0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
26700 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26710 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
26720 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
26730 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
26740 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
26750 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
26760 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
26770 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
26780 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
26790 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
267a0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
267b0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
267c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
267d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
267e0 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
267f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26810 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
26820 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
26830 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
26840 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
26850 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
26860 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
26870 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
26880 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
26890 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
268a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
268b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
268c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
268d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
268e0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
268f0 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
26900 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
26910 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
26920 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
26930 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
26940 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
26950 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
26960 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
26970 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
26980 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
26990 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
269a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
269b0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
269c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
269d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
269e0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
269f0 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
26a00 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
26a10 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
26a20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26a30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
26a40 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
26a50 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
26a60 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
26a70 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
26a80 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
26a90 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
26aa0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
26ab0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
26ac0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
26ad0 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
26ae0 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
26af0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
26b00 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
26b10 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
26b20 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
26b30 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
26b40 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
26b50 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
26b60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
26b70 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
26b80 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
26b90 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
26ba0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
26bb0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
26bc0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
26bd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26be0 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
26bf0 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
26c00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
26c10 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
26c20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
26c30 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
26c40 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
26c50 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
26c60 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
26c70 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
26c80 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
26c90 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
26ca0 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
26cb0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
26cc0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
26cd0 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
26ce0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
26cf0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
26d00 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
26d10 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
26d20 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
26d30 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
26d40 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
26d50 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
26d60 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
26d70 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
26d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26d90 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
26da0 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
26db0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
26dc0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
26dd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
26de0 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
26df0 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
26e00 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
26e10 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
26e20 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
26e30 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
26e40 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
26e50 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
26e60 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
26e70 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
26e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
26e90 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
26ea0 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
26eb0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
26ec0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
26ed0 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
26ee0 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
26ef0 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
26f00 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
26f10 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
26f20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
26f30 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
26f40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
26f50 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
26f60 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
26f70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26f80 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
26f90 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
26fa0 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
26fb0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
26fc0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
26fd0 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
26fe0 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
26ff0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
27000 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
27010 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
27020 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
27030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
27040 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
27050 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27070 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27080 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
27090 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
270a0 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
270b0 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
270c0 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
270d0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
270e0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
270f0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
27100 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
27110 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
27120 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
27130 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
27140 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
27150 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
27160 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
27170 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
27180 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
27190 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
271a0 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
271b0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
271c0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
271d0 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
271e0 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
271f0 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
27200 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
27210 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
27220 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
27230 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27240 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
27250 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
27260 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
27270 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
27280 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
27290 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
272a0 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
272b0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
272c0 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
272d0 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
272e0 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
272f0 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
27300 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
27310 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
27320 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
27330 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
27340 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
27350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27360 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
27370 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  e>pPager->dbHint
27380 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Size ){.    sqli
27390 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
273a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
273b0 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
273c0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
273d0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
273e0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
273f0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
27400 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
27410 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
27420 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
27430 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
27440 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
27450 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
27460 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
27470 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
27480 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
27490 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
274a0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
274b0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
274c0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
274d0 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
274e0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
274f0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
27500 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
27510 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
27520 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
27530 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
27540 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
27550 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
27560 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
27570 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
27580 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
27590 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
275a0 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
275b0 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
275c0 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
275d0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
275e0 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
275f0 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
27600 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
27610 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
27620 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
27630 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
27640 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
27650 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
27660 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
27670 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
27680 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
27690 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
276a0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
276b0 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
276f0 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
27700 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
27710 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
27720 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
27730 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
27740 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
27750 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
27760 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
27770 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
27780 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
27790 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
277a0 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
277b0 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
277c0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
277d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
277e0 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
277f0 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
27800 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
27810 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
27820 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
27830 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
27840 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
27850 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
27860 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
27870 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
27880 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
27890 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
278a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
278b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
278c0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
278d0 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
278e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
278f0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
27900 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
27910 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27920 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
27930 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
27940 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
27950 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
27960 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
27970 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
27980 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
27990 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
279a0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
279b0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
279c0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
279d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70    }..      /* Up
279e0 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
279f0 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
27a00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
27a10 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
27a20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
27a30 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
27a40 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
27a50 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
27a60 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
27a70 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
27a80 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
27a90 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
27aa0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
27ab0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
27ac0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
27ad0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
27ae0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
27af0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
27b00 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
27b10 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
27b20 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
27b30 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
27b40 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
27b50 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
27b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
27b70 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
27b80 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
27b90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27ba0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
27bb0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
27bc0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
27bd0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
27be0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
27bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c00 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
27c10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27c20 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
27c30 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
27c40 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
27c50 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
27c60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
27c70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27c80 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
27c90 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
27ca0 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
27cb0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
27cc0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
27cd0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
27ce0 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
27cf0 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
27d00 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
27d10 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
27d20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27d40 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
27d50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
27d60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
27d70 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
27d80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
27d90 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
27da0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
27db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
27dc0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
27dd0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
27de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
27df0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
27e00 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
27e10 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
27e20 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
27e30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27e40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
27e50 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
27e60 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
27e70 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
27e80 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
27e90 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
27ea0 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
27eb0 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
27ec0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
27ed0 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
27ee0 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
27ef0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
27f00 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
27f10 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
27f20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
27f30 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
27f40 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
27f50 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
27f60 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
27f70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
27f80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
27f90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27fa0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
27fb0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
27fc0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
27fd0 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
27fe0 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
27ff0 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
28000 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
28010 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
28020 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
28030 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
28040 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
28050 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
28060 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
28070 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
28080 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
28090 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
280a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
280b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
280c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
280d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
280e0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
280f0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
28100 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
28110 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
28120 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
28130 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
28140 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
28150 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
28160 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
28170 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28180 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
28190 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
281a0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
281b0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
281c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
281d0 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
281e0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
281f0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
28200 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
28210 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20  nal(pPg) .      
28220 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
28230 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
28240 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
28250 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
28260 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
28270 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
28280 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
28290 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
282a0 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
282b0 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
282c0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
282d0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
282e0 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
282f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28300 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
28310 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
28320 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
28330 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  et = pPager->nSu
28340 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
28350 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
28360 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
28370 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
28380 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
28390 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
283a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
283b0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
283c0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
283d0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
283e0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
283f0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
28400 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
28410 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
28420 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
28430 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
28440 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28470 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
28480 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
28490 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
284a0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
284b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
284c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
284d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
284e0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
284f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
28500 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
28510 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
28520 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
28530 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
28540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28560 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
28570 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
28580 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
28590 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
285a0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
285b0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
285c0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
285d0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
285e0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
285f0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
28600 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
28610 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
28620 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
28630 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
28640 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
28650 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
28660 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
28670 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
28680 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
28690 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
286a0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
286b0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
286c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
286d0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
286e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
286f0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
28700 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
28710 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
28720 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
28730 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
28740 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
28750 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
28760 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
28770 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
28780 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
28790 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
287a0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
287b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
287c0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
287d0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
287e0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
287f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
28800 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
28810 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
28820 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
28830 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
28840 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
28850 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28860 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
28870 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
28880 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
28890 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
288a0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
288b0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
288c0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
288d0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
288e0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
288f0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
28900 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
28910 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
28920 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
28930 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
28940 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
28950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28960 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
28970 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
28980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
28990 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
289a0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
289b0 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
289c0 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
289d0 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
289e0 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
289f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
28a00 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
28a10 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
28a20 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
28a30 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
28a40 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
28a50 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
28a60 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
28a70 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
28a80 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
28a90 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
28aa0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
28ab0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
28ac0 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
28ad0 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
28ae0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
28af0 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
28b00 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
28b10 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
28b20 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
28b30 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
28b40 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
28b50 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
28b60 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
28b70 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
28b80 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
28b90 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
28ba0 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
28bb0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
28bc0 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
28bd0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
28be0 71 6c 69 74 65 33 50 43 61 63 68 65 46 65 74 63  qlite3PCacheFetc
28bf0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
28c00 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
28c10 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
28c20 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
28c30 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
28c40 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
28c50 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
28c60 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
28c70 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
28c80 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
28c90 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
28ca0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
28cb0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
28cc0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
28cd0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
28ce0 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
28cf0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
28d00 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
28d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28d20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
28d30 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
28d40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
28d50 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
28d60 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
28d70 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
28d80 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
28d90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28da0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
28db0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
28dc0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
28dd0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
28de0 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
28df0 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
28e00 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
28e10 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
28e20 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
28e30 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
28e40 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
28e50 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
28e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
28e80 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
28e90 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
28ea0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
28eb0 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
28ec0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
28ed0 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
28ee0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
28ef0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
28f00 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
28f10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
28f20 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
28f30 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
28f40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
28f50 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
28f60 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
28f70 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
28f80 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70  number of this p
28f90 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  age is larger th
28fa0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  an the current s
28fb0 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ize of.    ** th
28fc0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
28fd0 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
28fe0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
28ff0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
29000 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
29010 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
29020 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
29030 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
29040 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  will not.    ** 
29050 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64  actually write d
29060 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ata to the file 
29070 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
29080 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73    **.    ** Cons
29090 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
290a0 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
290b0 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  vents:.    **.  
290c0 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
290d0 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
290e0 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  l page X>.    **
290f0 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
29100 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
29110 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
29120 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69    **       <shri
29130 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  nk database file
29140 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20   to Y pages>.   
29150 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
29160 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
29170 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
29180 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a  K TO sp;.    **.
29190 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c      ** If (X>Y),
291a0 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
291b0 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
291c0 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
291d0 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
291e0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
291f0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74  tabase file, but
29200 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64   will be dropped
29210 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e   from the cache.
29220 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f   Then,.    ** fo
29230 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
29240 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
29250 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
29260 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
29270 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  .    ** data fro
29280 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
29290 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
292a0 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
292b0 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a  ge X as it.    *
292c0 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74  * was when the t
292d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
292e0 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61  ed, not as it wa
292f0 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e  s when "SAVEPOIN
29300 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73  T sp".    ** was
29310 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
29320 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
29330 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
29340 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
29350 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
29360 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  to the .    ** s
29370 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29380 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
29390 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
293a0 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
293b0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74  l.    ** be rest
293c0 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72  ored to its curr
293d0 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ent value when t
293e0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
293f0 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  sp" is .    ** e
29400 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  xecuted..    */.
29410 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20      if( NEVER(. 
29420 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
29430 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
29440 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
29450 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
29460 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20  Page(pPg).    ) 
29470 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
29480 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
29490 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
294a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
294b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
294c0 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
294d0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
294e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
294f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
29500 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
29510 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29520 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
29530 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
29540 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
29550 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
29560 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
29570 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
29580 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
29590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
295a0 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
295b0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
295c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
295d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
295e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
295f0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
29600 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
29610 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
29620 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   rc); .}.../*.**
29630 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
29640 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
29650 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
29660 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
29670 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
29680 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
29690 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
296a0 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
296b0 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
296c0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
296d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
296e0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
296f0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
29700 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29710 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
29720 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
29730 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
29740 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
29750 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
29760 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
29770 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
29780 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
29790 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
297a0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
297b0 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
297c0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
297d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
297e0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
297f0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
29800 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
29810 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
29820 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
29830 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
29840 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
29850 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
29860 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
29870 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
29880 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
29890 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
298a0 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
298b0 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
298c0 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
298d0 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
298e0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
298f0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
29900 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
29910 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
29920 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
29930 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
29940 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
29950 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
29960 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
29970 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
29980 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
29990 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
299a0 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
299b0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
299c0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
299d0 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
299e0 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
299f0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
29a00 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
29a10 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
29a20 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
29a30 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
29a40 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
29a50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
29a60 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
29a70 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
29a80 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
29a90 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
29aa0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
29ab0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
29ac0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
29ad0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29ae0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
29af0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
29b00 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
29b10 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
29b20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
29b30 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
29b40 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
29b50 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
29b60 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
29b70 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
29b80 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
29b90 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
29ba0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
29bb0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
29bc0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
29bd0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
29be0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
29bf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29c00 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
29c10 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
29c20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
29c30 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
29c40 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
29c50 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
29c60 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
29c70 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
29c80 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
29c90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
29ca0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
29cb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29cc0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
29cd0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
29ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
29cf0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
29d00 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
29d10 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
29d20 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
29d30 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
29d40 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
29d50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
29d60 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
29d70 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
29d80 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
29d90 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
29da0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
29db0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
29dc0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
29dd0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
29de0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
29df0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
29e00 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
29e10 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
29e20 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
29e30 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
29e40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29e50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29e60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
29e70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
29e80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
29e90 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
29ea0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
29eb0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
29ec0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
29ed0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
29ee0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
29ef0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
29f00 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
29f10 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
29f20 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
29f30 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
29f40 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
29f50 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
29f60 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
29f70 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
29f80 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
29f90 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
29fa0 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
29fb0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
29fc0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
29fd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29fe0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
29ff0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2a000 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2a010 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2a020 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2a030 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2a040 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2a050 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
2a060 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
2a070 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
2a080 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
2a090 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
2a0a0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2a0b0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2a0c0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2a0d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2a0e0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2a0f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2a100 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2a110 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2a120 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2a130 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2a140 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2a150 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2a160 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2a170 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2a180 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2a190 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2a1a0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2a1b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
2a1c0 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
2a1d0 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
2a1e0 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
2a1f0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
2a200 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
2a210 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
2a220 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2a230 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
2a240 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
2a250 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
2a260 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
2a270 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
2a280 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
2a290 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
2a2a0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
2a2b0 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
2a2c0 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
2a2d0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a2e0 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
2a2f0 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
2a300 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
2a310 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2a320 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
2a330 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2a340 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
2a350 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2a360 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
2a370 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
2a380 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
2a390 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2a3a0 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
2a3b0 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
2a3c0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
2a3d0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
2a3e0 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
2a3f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
2a400 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
2a410 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2a420 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
2a430 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41    if( flags & PA
2a440 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  GER_MEMORY ){.  
2a450 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
2a460 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2a470 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2a480 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2a490 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2a4a0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2a4b0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2a4c0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2a4d0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2a4e0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2a4f0 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2a500 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2a510 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2a520 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2a530 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2a540 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2a550 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2a560 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68  [0] ){.    nPath
2a570 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2a580 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2a590 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2a5a0 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  e3Malloc(nPathna
2a5b0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2a5c0 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2a5d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2a5e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2a5f0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
2a600 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
2a610 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
2a620 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
2a630 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
2a640 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a650 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
2a660 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2a670 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
2a680 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e  ame);.    nPathn
2a690 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2a6a0 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2a6b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2a6c0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2a6d0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2a6e0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2a6f0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2a700 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2a710 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2a720 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2a730 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2a740 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2a750 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2a760 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a770 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2a780 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2a790 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2a7a0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2a7b0 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2a7c0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2a7d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2a7e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2a7f0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2a800 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2a810 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2a820 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2a830 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2a840 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2a850 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2a860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a880 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
2a890 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a8a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2a8b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2a8c0 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2a8d0 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2a8e0 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2a8f0 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2a900 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2a910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2a920 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2a930 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2a940 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2a950 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2a960 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2a970 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2a980 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2a990 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2a9a0 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2a9b0 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2a9c0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2a9d0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2a9e0 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2a9f0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2aa00 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2aa10 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2aa20 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2aa30 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2aa40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2aa50 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2aa60 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2aa70 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2aa80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2aa90 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2aaa0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2aab0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2aac0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2aae0 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2aaf0 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2ab00 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2ab10 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2ab20 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2ab30 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2ab40 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2ab50 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2ab60 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2ab70 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2ab80 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2ab90 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2aba0 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2abb0 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2abc0 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2abd0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2abe0 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2abf0 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2ac00 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2ac10 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2ac20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2ac30 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2ac40 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2ac50 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
2ac60 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2ac70 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2ac80 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20  e + 8 + 1       
2ac90 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2aca0 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2acb0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2acc0 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2acd0 34 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  4 + 1           
2ace0 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2acf0 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2ad00 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2ad10 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2ad20 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2ad30 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2ad40 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2ad50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ad60 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2ad70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ad80 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
2ad90 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
2ada0 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
2adb0 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
2adc0 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
2add0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2ade0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2adf0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
2ae00 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
2ae10 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2ae20 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
2ae30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
2ae40 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
2ae50 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2ae60 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2ae70 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
2ae80 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
2ae90 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
2aea0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2aeb0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2aec0 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
2aed0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2aee0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
2aef0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2af00 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
2af10 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
2af20 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
2af30 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
2af40 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
2af50 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
2af60 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
2af70 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  thname ){.    as
2af80 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e  sert( nPathname>
2af90 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2afa0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
2afb0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
2afc0 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  athname + 1);.  
2afd0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2afe0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2aff0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2b000 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2b010 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2b020 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2b030 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2b040 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2b050 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2b060 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a  "-journal", 8);.
2b070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b080 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2b090 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2b0a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2b0b0 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2b0c0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2b0d0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2b0e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b0f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b100 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2b110 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 23 65  , "-wal", 4);.#e
2b120 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2b130 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2b140 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2b150 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2b160 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
2b170 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
2b180 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
2b190 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2b1a0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2b1b0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2b1c0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2b1f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
2b200 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
2b210 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2b220 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
2b230 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2b240 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
2b250 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  out);.    assert
2b260 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20  ( !memDb );.    
2b270 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
2b280 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2b290 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
2b2a0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
2b2b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
2b2c0 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
2b2d0 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
2b2e0 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
2b2f0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
2b300 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
2b310 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
2b320 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
2b330 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
2b340 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
2b350 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
2b360 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
2b370 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2b380 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
2b390 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
2b3a0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2b3b0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
2b3c0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
2b3d0 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
2b3e0 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
2b3f0 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
2b400 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b420 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2b430 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
2b440 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2b450 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44   assert(SQLITE_D
2b460 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2b470 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2b480 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
2b490 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67  .      if( szPag
2b4a0 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2b4b0 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2b4c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b4d0 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2b4e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2b4f0 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2b500 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2b510 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
2b520 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
2b530 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b540 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2b550 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65  flt = (u32)pPage
2b560 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
2b570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2b590 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2b5a0 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  TE.      {.     
2b5b0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
2b5c0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2b5d0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2b5e0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
2b5f0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2b600 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2b610 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
2b620 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
2b630 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2b640 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2b650 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2b660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2b670 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2b680 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
2b690 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  6);.        for(
2b6a0 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2b6b0 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2b6c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2b6d0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2b6e0 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
2b6f0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2b700 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
2b710 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2b720 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
2b730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b740 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2b750 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b760 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
2b770 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
2b780 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
2b790 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
2b7a0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
2b7b0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
2b7c0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
2b7d0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
2b7e0 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
2b7f0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
2b800 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
2b810 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
2b820 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
2b830 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2b840 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
2b850 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
2b860 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
2b870 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
2b880 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
2b890 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
2b8a0 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
2b8b0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
2b8c0 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
2b8d0 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
2b8e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2b8f0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
2b900 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2b910 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2b920 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
2b930 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
2b940 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
2b950 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  K;.    readOnly 
2b960 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
2b970 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2b980 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2b990 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
2b9a0 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
2b9b0 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
2b9c0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
2b9d0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
2b9e0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
2b9f0 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
2ba00 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
2ba10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2ba20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ba30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ba40 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
2ba50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ba60 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
2ba70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
2ba80 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
2ba90 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
2baa0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
2bab0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2bac0 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
2bad0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
2bae0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
2baf0 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
2bb00 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
2bb10 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
2bb20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bb30 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2bb40 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
2bb50 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
2bb60 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2bb70 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2bb80 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
2bb90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2bba0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2bbb0 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2bbc0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73  object. */.  ass
2bbd0 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
2bbe0 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52   );.  nExtra = R
2bbf0 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2bc00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2bc10 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2bc20 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc40 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
2bc50 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
2bc60 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
2bc70 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41  >pPCache);..  PA
2bc80 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
2bc90 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
2bca0 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
2bcb0 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
2bcc0 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
2bcd0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
2bce0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
2bcf0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
2bd00 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
2bd10 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
2bd20 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
2bd30 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  ->noReadlock = (
2bd40 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
2bd50 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20  adOnly) ?1:0;.  
2bd60 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
2bd70 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
2bd80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
2bd90 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
2bda0 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
2bdb0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2bdc0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
2bdd0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2bde0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
2bdf0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2be00 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
2be10 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
2be20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
2be30 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
2be40 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2be50 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66  R_UNLOCK; */.#if
2be60 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   0.  assert( pPa
2be70 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
2be80 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
2be90 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
2bea0 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e  R_UNLOCK) );.#en
2beb0 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  dif.  /* pPager-
2bec0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2bed0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2bee0 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2bef0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2bf00 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2bf10 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2bf20 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2bf30 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2bf40 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2bf50 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2bf60 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2bf70 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2bf80 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2bf90 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2bfa0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2bfb0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2bfc0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2bfd0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2bfe0 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2bff0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2c000 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2c010 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2c020 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2c030 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2c040 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2c050 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2c060 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2c070 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2c080 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2c090 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
2c0a0 73 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67  syncFlags = pPag
2c0b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a  er->noSync ? 0 :
2c0c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2c0d0 4d 41 4c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  MAL;.  pPager->c
2c0e0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  kptSyncFlags = p
2c0f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2c100 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
2c110 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2c120 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2c130 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2c140 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2c150 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2c160 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2c170 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2c180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2c190 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2c1a0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2c1b0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2c1c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2c1d0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2c1e0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2c1f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2c200 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2c210 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2c220 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2c230 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c240 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2c250 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2c260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2c270 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2c280 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2c290 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2c2a0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2c2b0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c2c0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2c2d0 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2c2e0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2c2f0 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2c300 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2c310 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2c320 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2c330 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2c340 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2c350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2c360 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2c370 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2c380 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69  fter transitioni
2c390 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e  ng from PAGER_UN
2c3a0 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52  LOCK to.** PAGER
2c3b0 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49  _SHARED state. I
2c3c0 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  t tests if there
2c3d0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2c3e0 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  l present in.** 
2c3f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2c400 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
2c410 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ger. A hot journ
2c420 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a  al is one that .
2c430 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ** needs to be p
2c440 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f  layed back. Acco
2c450 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75  rding to this fu
2c460 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f  nction, a hot-jo
2c470 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78  urnal.** file ex
2c480 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ists if the foll
2c490 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61  owing criteria a
2c4a0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
2c4b0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2c4c0 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  le exists in the
2c4d0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e   file system, an
2c4e0 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63  d.**   * No proc
2c4f0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2c500 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
2c510 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2c520 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a  base file, and.*
2c530 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2c540 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69  se file itself i
2c550 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
2c560 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
2c570 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  and.**   * The f
2c580 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
2c590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2c5a0 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
2c5b0 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  0x00..**.** If t
2c5c0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2c5d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2c5e0 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
2c5f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2c600 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
2c610 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
2c620 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
2c630 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
2c640 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
2c650 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49  the same name. I
2c660 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2c670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
2c680 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ** just deleted 
2c690 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20  using OsDelete, 
2c6a0 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2c6b0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2c6c0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2c6d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2c6e0 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63  utine does not c
2c6f0 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
2c700 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2c710 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74  l filename.** at
2c720 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2c730 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
2c740 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74  s, and that mast
2c750 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
2c760 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
2c770 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  t, then the jour
2c780 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2c790 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74  really hot. In t
2c7a0 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73  his.** case this
2c7b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2c7c0 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  turn a false-pos
2c7d0 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72  itive. The pager
2c7e0 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72  _playback().** r
2c7f0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
2c800 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f  over that the jo
2c810 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2c820 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
2c830 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f   .** will not ro
2c840 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a  ll it back. .**.
2c850 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ** If a hot-jour
2c860 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  nal file is foun
2c870 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78  d to exist, *pEx
2c880 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31  ists is set to 1
2c890 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2c8a0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2c8b0 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  no hot-journal f
2c8c0 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ile is present, 
2c8d0 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73  *pExists is.** s
2c8e0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2c8f0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2c900 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2c910 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2c920 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ng.** to determi
2c930 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2c940 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  t a hot-journal 
2c950 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65  file exists, the
2c960 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   IO error.** cod
2c970 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2c980 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2c990 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66  pExists is undef
2c9a0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2c9b0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
2c9c0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
2c9d0 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
2c9e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2c9f0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2ca00 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
2ca10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ca20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ca30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2ca40 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20  nt exists = 1;  
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca60 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61  True if a journa
2ca70 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2ca80 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f  t */.  int jrnlO
2ca90 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70  pen = !!isOpen(p
2caa0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20  Pager->jfd);..  
2cab0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cac0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2cad0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2cae0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2caf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cb00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2cb10 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  EN );..  assert(
2cb20 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
2cb30 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
2cb40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2cb50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
2cb60 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
2cb70 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
2cb80 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
2cb90 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
2cba0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2cbb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2cbc0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
2cbd0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2cbe0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2cbf0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
2cc00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2cc10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
2cc20 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
2cc30 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  ocked = 0;      
2cc40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2cc50 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
2cc60 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2cc70 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
2cc80 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
2cc90 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
2cca0 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
2ccb0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
2ccc0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
2ccd0 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
2cce0 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
2ccf0 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
2cd00 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
2cd10 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
2cd20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
2cd30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2cd40 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
2cd50 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
2cd60 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
2cd70 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
2cd80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
2cd90 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
2cda0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
2cdb0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
2cdc0 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
2cdd0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2cde0 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
2cdf0 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
2ce00 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
2ce10 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
2ce20 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
2ce30 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
2ce40 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
2ce50 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
2ce60 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
2ce70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2ce80 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2ce90 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
2cea0 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
2ceb0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2cec0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
2ced0 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ed ){.      Pgno
2cee0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2cef0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cf00 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2cf10 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2cf20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2cf30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
2cf40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2cf50 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
2cf60 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
2cf70 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
2cf80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2cf90 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
2cfa0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
2cfb0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
2cfc0 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
2cfd0 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
2cfe0 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
2cff0 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
2d000 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2d010 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
2d020 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
2d030 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
2d040 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
2d050 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
2d060 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
2d070 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2d080 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2d090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d0a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  {.        if( nP
2d0b0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2d0c0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
2d0d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2d0e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
2d0f0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2d100 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
2d110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d120 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d130 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
2d140 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2d150 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
2d160 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2d170 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
2d180 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
2d190 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
2d1a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
2d1b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d1c0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
2d1d0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
2d1e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2d1f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2d200 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
2d210 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2d220 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
2d230 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
2d240 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2d250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d260 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
2d270 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
2d280 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
2d290 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
2d2a0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
2d2b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2d2c0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
2d2d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
2d2e0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
2d2f0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
2d300 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
2d310 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
2d320 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
2d330 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2d340 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2d350 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2d360 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
2d370 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2d380 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
2d390 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
2d3a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2d3b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2d3c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2d3d0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2d3e0 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
2d3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2d400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
2d420 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
2d430 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2d440 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
2d450 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
2d460 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
2d470 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d480 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
2d490 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
2d4b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2d4c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d4d0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
2d4e0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
2d4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
2d500 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
2d510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2d520 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
2d530 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
2d540 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
2d550 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2d560 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
2d570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2d580 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
2d590 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
2d5a0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
2d5b0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
2d5c0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
2d5d0 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
2d5e0 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
2d5f0 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
2d600 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
2d610 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
2d620 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
2d630 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
2d640 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
2d650 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
2d660 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
2d670 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
2d680 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
2d690 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
2d6a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
2d6b0 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
2d6c0 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
2d6d0 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
2d6e0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
2d6f0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
2d700 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
2d710 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
2d720 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
2d730 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d740 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
2d750 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2d760 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
2d770 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
2d780 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
2d790 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
2d7a0 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
2d7b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d7c0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
2d7d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2d7e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d7f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d800 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d810 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2d820 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2d830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d840 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
2d850 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
2d860 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2d870 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
2d880 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
2d890 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
2d8a0 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  e() until after 
2d8b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2d8c0 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2d8d0 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
2d8e0 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
2d8f0 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
2d900 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
2d910 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2d920 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
2d930 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
2d940 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
2d950 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
2d960 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2d970 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
2d980 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
2d990 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
2d9a0 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f  R_OPEN state (no
2d9b0 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
2d9c0 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
2d9d0 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
2d9e0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2d9f0 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
2da00 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
2da10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2da20 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
2da30 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
2da40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
2da50 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
2da60 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
2da70 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
2da80 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
2da90 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
2daa0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
2dab0 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
2dac0 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
2dad0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
2dae0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2daf0 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
2db00 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
2db10 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
2db20 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
2db30 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
2db40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
2db50 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
2db60 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
2db70 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
2db80 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
2db90 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
2dba0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
2dbb0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
2dbc0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
2dbd0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
2dbe0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2dbf0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
2dc00 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
2dc10 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2dc20 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
2dc30 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
2dc40 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
2dc50 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
2dc60 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
2dc70 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
2dc80 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2dc90 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
2dca0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
2dcb0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
2dcc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
2dcd0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2dce0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2dcf0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2dd00 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
2dd10 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
2dd20 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
2dd30 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
2dd40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2dd50 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67  e or .** rolling
2dd60 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
2dd70 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
2dd80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2dd90 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
2dda0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
2ddb0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
2ddc0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2ddd0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2dde0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ddf0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
2de00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2de10 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
2de20 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
2de30 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2de40 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
2de50 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
2de60 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
2de70 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f   pager state sho
2de80 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20  uld either.  ** 
2de90 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45  be OPEN or READE
2dea0 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c  R. READER is onl
2deb0 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
2dec0 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61  e pager is or wa
2ded0 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75  s in .  ** exclu
2dee0 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
2def0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2df00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2df10 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2df20 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
2df30 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2df40 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2df50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2df60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2df70 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
2df80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2df90 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
2dfa0 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20  if( NEVER(MEMDB 
2dfb0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
2dfc0 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50  de) ){ return pP
2dfd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d  ager->errCode; }
2dfe0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
2dff0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
2e000 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2e010 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
2e020 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61    int bHotJourna
2e030 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
2e040 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
2e050 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f   exists a hot jo
2e060 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20  urnal-file */.. 
2e070 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2e080 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
2e090 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2e0a0 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ock==0 || pPager
2e0b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20  ->readOnly );.. 
2e0c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
2e0d0 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a  oReadlock==0 ){.
2e0e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2e0f0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
2e100 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
2e110 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2e120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2e140 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
2e150 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
2e160 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
2e170 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
2e180 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2e190 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2e1a0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
2e1b0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
2e1c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
2e1d0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
2e1e0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2e1f0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
2e200 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
2e210 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
2e220 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
2e230 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
2e240 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
2e250 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
2e260 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
2e270 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
2e280 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
2e290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2e2b0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
2e2c0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
2e2d0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
2e2e0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
2e2f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2e300 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
2e310 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
2e320 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
2e330 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
2e340 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
2e350 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
2e360 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
2e370 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
2e380 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
2e390 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
2e3a0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
2e3b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2e3c0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
2e3d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
2e3e0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
2e3f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
2e400 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
2e410 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
2e420 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
2e430 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
2e440 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
2e450 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
2e460 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
2e470 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
2e480 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
2e490 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
2e4a0 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
2e4b0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
2e4c0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
2e4d0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
2e4e0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
2e4f0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
2e500 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
2e510 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
2e520 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
2e530 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2e540 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
2e550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e560 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e570 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
2e580 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
2e590 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2e5a0 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
2e5b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
2e5c0 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
2e5d0 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
2e5e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2e5f0 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
2e600 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
2e610 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
2e620 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
2e630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e650 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2e660 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
2e670 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
2e680 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
2e690 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
2e6a0 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
2e6b0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
2e6c0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
2e6d0 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
2e6e0 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
2e6f0 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
2e700 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
2e710 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
2e720 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e730 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
2e740 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
2e750 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
2e760 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
2e770 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
2e780 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
2e790 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
2e7a0 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
2e7b0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
2e7c0 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
2e7d0 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
2e7e0 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
2e7f0 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
2e800 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
2e810 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
2e820 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e830 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
2e840 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
2e850 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
2e860 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
2e870 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
2e880 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
2e890 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
2e8a0 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
2e8b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
2e8c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
2e8d0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
2e8e0 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
2e8f0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
2e900 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
2e910 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
2e920 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
2e930 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
2e940 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
2e950 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
2e960 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
2e970 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
2e980 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
2e990 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e9a0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
2e9b0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2e9c0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2e9d0 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
2e9e0 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
2e9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ea00 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
2ea10 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
2ea20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ea30 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
2ea40 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
2ea50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
2ea60 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2ea70 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
2ea80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ea90 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
2eaa0 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
2eab0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
2eac0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2ead0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2eae0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2eaf0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2eb00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2eb10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2eb20 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
2eb30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2eb40 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2eb50 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
2eb60 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
2eb70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
2eb80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2eb90 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
2eba0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
2ebb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2ebc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
2ebd0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2ebe0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
2ebf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ec00 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2ec10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2ec20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2ec30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2ec40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ec50 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2ec60 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
2ec70 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2ec80 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
2ec90 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
2eca0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
2ecb0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
2ecc0 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
2ecd0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
2ece0 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
2ecf0 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
2ed00 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
2ed10 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
2ed20 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
2ed30 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
2ed40 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
2ed50 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2ed60 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
2ed70 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
2ed80 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
2ed90 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
2eda0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
2edb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
2edc0 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
2edd0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
2ede0 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
2edf0 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
2ee00 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
2ee10 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
2ee20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ee30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2ee40 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2ee50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2ee60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2ee70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2ee80 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
2ee90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
2eea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2eeb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2eec0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
2eed0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
2eee0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2eef0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
2ef00 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
2ef10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
2ef20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2ef30 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
2ef40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
2ef50 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2ef60 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
2ef70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ef80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ef90 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2efa0 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
2efb0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2efc0 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
2efd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
2efe0 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
2eff0 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
2f000 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
2f010 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
2f020 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
2f030 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
2f040 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
2f050 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
2f060 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
2f070 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
2f080 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
2f090 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
2f0a0 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
2f0b0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
2f0c0 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
2f0d0 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
2f0e0 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
2f0f0 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
2f100 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
2f110 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
2f120 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
2f130 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f140 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
2f150 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
2f160 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
2f170 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
2f180 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
2f190 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
2f1a0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
2f1b0 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
2f1c0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
2f1d0 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
2f1e0 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
2f1f0 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
2f200 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
2f210 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
2f220 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
2f230 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
2f240 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
2f250 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
2f260 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
2f270 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
2f280 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
2f290 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
2f2a0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
2f2b0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2f2c0 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
2f2d0 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
2f2e0 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
2f2f0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
2f300 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
2f310 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
2f320 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
2f330 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
2f340 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
2f350 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f360 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
2f370 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
2f380 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2f390 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2f3a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f3b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2f3c0 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
2f3d0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
2f3e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
2f3f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
2f400 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2f410 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
2f420 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
2f430 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
2f440 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
2f450 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20  ger->tempFile . 
2f460 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
2f470 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
2f480 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
2f490 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2f4a0 65 29 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  e)>0) .    ){.  
2f4b0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
2f4c0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
2f4d0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
2f4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f4f0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
2f500 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
2f510 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
2f520 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
2f530 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
2f540 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
2f550 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
2f560 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2f570 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
2f580 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
2f590 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
2f5a0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
2f5b0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
2f5c0 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
2f5d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
2f5e0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
2f5f0 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
2f600 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
2f610 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
2f620 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
2f630 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
2f640 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
2f650 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
2f660 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
2f670 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
2f680 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
2f690 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
2f6a0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
2f6b0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
2f6c0 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
2f6d0 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
2f6e0 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
2f6f0 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
2f700 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
2f710 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
2f720 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
2f730 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
2f740 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
2f750 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
2f760 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
2f770 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
2f780 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
2f790 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
2f7a0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
2f7b0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
2f7c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e      */.      Pgn
2f7d0 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  o nPage = 0;.   
2f7e0 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
2f7f0 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
2f800 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
2f810 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2f820 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2f830 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2f840 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2f850 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69  failed;..      i
2f860 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
2f870 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2f880 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
2f890 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
2f8a0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
2f8b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f8c0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2f8d0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
2f8e0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
2f8f0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
2f900 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f920 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2f930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
2f950 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
2f960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
2f970 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2f980 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
2f990 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
2f9a0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
2f9b0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
2f9c0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
2f9d0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
2f9e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
2f9f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2fa00 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
2fa10 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
2fa20 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
2fa30 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
2fa40 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
2fa50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
2fa60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
2fa70 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
2fa80 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
2fa90 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
2faa0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
2fab0 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
2fac0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2fad0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fae0 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
2faf0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
2fb00 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
2fb10 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2fb20 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
2fb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fb40 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
2fb50 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
2fb60 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
2fb70 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
2fb80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2fb90 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
2fba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2fbb0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2fbc0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
2fbd0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
2fbe0 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
2fbf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fc00 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2fc10 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
2fc20 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
2fc30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fc40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2fc50 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
2fc60 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
2fc70 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2fc80 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ADER;.  }.  retu
2fc90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fca0 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
2fcb0 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
2fcc0 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
2fcd0 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
2fce0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
2fcf0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
2fd00 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
2fd10 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
2fd20 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
2fd30 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
2fd40 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
2fd50 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
2fd60 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
2fd70 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
2fd80 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
2fd90 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
2fda0 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
2fdb0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
2fdc0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
2fdd0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
2fde0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2fdf0 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
2fe00 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2fe10 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2fe20 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e  ) ){.    pagerUn
2fe30 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
2fe40 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
2fe50 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
2fe60 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
2fe70 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
2fe80 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
2fe90 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
2fea0 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
2feb0 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
2fec0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
2fed0 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
2fee0 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
2fef0 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
2ff00 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
2ff10 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
2ff20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
2ff30 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
2ff40 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
2ff50 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
2ff60 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
2ff70 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
2ff80 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2ff90 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
2ffa0 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
2ffb0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2ffc0 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
2ffd0 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
2ffe0 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
2fff0 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
30000 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
30010 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
30020 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
30030 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
30040 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
30050 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
30060 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
30070 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
30080 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
30090 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
300a0 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
300b0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
300c0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
300d0 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
300e0 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
300f0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
30100 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
30110 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30120 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
30130 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
30140 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
30150 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
30160 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
30170 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
30180 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
30190 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
301a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
301b0 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
301c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
301d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
301e0 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
301f0 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
30200 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
30210 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
30220 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
30230 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
30240 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
30250 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
30260 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
30270 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
30280 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
30290 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
302a0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
302b0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
302c0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
302d0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
302e0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
302f0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
30300 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
30310 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
30320 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
30330 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
30340 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
30350 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
30360 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
30370 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
30380 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
30390 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
303a0 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
303b0 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
303c0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
303d0 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
303e0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
303f0 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
30400 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
30410 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
30420 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
30430 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
30440 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
30450 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
30460 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
30470 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
30480 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
30490 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
304a0 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
304b0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
304c0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
304d0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
304e0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
304f0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
30500 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
30510 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
30520 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
30530 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
30540 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
30550 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
30560 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
30570 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
30580 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
30590 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
305a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
305b0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
305c0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
305d0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
305e0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
305f0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
30600 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
30610 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
30620 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
30630 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
30640 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
30650 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
30660 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
30670 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
30680 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
30690 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
306a0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
306b0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
306c0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
306d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
306e0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
306f0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
30700 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
30710 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
30720 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
30730 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
30740 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
30750 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
30760 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
30770 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
30780 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
30790 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
307a0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
307b0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
307c0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
307d0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
307e0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
307f0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
30800 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
30810 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
30820 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
30830 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
30840 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
30850 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
30860 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
30870 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
30880 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
30890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
308a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
308b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
308c0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
308d0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
308e0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
308f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
30900 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
30910 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
30920 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
30930 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
30940 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
30950 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
30960 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
30970 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
30980 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
30990 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
309a0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
309b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
309c0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
309d0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
309e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
309f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
30a00 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
30a10 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
30a20 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
30a30 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
30a40 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
30a50 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
30a60 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
30a70 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
30a80 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
30a90 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
30aa0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
30ab0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
30ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
30ad0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
30ae0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
30af0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70  ache, pgno, 1, p
30b00 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  pPage);.  }..  i
30b10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30b20 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
30b30 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
30b40 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
30b50 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
30b60 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
30b70 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
30b80 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
30b90 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
30ba0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
30bb0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
30bc0 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
30bd0 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
30be0 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
30bf0 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
30c00 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
30c10 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
30c20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
30c30 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
30c40 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
30c50 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
30c60 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
30c70 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
30c80 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
30c90 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  )->pPager && !no
30ca0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
30cb0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
30cc0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
30cd0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
30ce0 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
30cf0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
30d00 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
30d10 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
30d20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
30d30 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
30d40 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
30d50 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
30d60 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  r) );.    PAGER_
30d70 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
30d80 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
30d90 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
30da0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
30db0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
30dc0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
30dd0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
30de0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
30df0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
30e00 20 2a 2f 0a 0a 20 20 20 20 50 41 47 45 52 5f 49   */..    PAGER_I
30e10 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
30e20 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
30e30 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
30e40 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
30e50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
30e60 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
30e70 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
30e80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
30e90 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
30ea0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
30eb0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
30ec0 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
30ed0 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
30ee0 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
30ef0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
30f00 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
30f10 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
30f20 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
30f30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30f40 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
30f50 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
30f60 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
30f70 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67  f( MEMDB || pPag
30f80 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20  er->dbSize<pgno 
30f90 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20  || noContent || 
30fa0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
30fb0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
30fc0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
30fd0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
30fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
30ff0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
31000 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
31010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31020 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
31030 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
31040 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
31050 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
31060 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
31070 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
31080 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
31090 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
310a0 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
310b0 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
310c0 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
310d0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
310e0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
310f0 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
31100 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
31110 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
31120 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
31130 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
31140 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
31150 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
31160 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
31170 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
31180 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31190 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
311a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
311b0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
311c0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
311d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
311e0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
311f0 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
31200 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
31210 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
31220 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31230 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
31240 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
31250 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
31260 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
31270 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
31280 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
31290 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
312a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
312b0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
312c0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
312d0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
312e0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
312f0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
31300 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
31310 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
31320 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
31330 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
31340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
31350 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
31360 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
31370 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
31380 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
31390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
313a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
313b0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
313c0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
313d0 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
313e0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
313f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
31400 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
31410 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
31420 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31430 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
31440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
31450 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
31460 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
31470 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
31480 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
31490 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
314a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
314b0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
314c0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
314d0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
314e0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
314f0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
31500 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
31510 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
31520 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
31530 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
31540 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
31550 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
31560 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
31570 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
31580 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
31590 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
315a0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
315b0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
315c0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
315d0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
315e0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
315f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31600 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
31610 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
31620 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
31630 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
31640 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
31650 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
31660 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
31670 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
31680 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
31690 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
316a0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
316b0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
316c0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
316d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
316e0 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
316f0 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
31700 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  he!=0 );.  asser
31710 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31720 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
31730 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
31740 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
31750 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
31760 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
31770 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
31780 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e   &pPg);.  return
31790 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
317a0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
317b0 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
317c0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
317d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
317e0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
317f0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
31800 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
31810 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
31820 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
31830 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
31840 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
31850 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
31860 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
31870 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31880 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
31890 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
318a0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
318b0 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
318c0 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
318d0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
318e0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
318f0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
31900 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
31910 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
31920 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
31930 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
31940 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
31950 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
31960 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
31970 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
31980 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
31990 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
319a0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
319b0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
319c0 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
319d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
319e0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
319f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
31a00 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
31a10 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
31a20 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
31a30 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
31a40 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
31a50 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
31a60 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
31a70 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
31a80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
31a90 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
31aa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31ab0 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
31ac0 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
31ad0 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
31ae0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
31af0 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
31b00 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
31b10 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
31b20 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
31b30 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
31b40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
31b50 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
31b60 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
31b70 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
31b80 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
31b90 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
31ba0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
31bb0 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
31bc0 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
31bd0 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
31be0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
31bf0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
31c00 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
31c10 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
31c20 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
31c30 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
31c40 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
31c50 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
31c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
31c70 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
31c80 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
31c90 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
31ca0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
31cb0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
31cc0 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
31cd0 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
31ce0 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
31cf0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
31d00 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
31d10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31d20 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
31d30 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
31d40 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
31d50 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
31d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
31d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
31d90 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
31da0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
31db0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
31dc0 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
31dd0 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
31de0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
31df0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31e00 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
31e10 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
31e20 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
31e30 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
31e40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31e50 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
31e60 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
31e70 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
31e80 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
31e90 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
31ea0 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
31eb0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
31ec0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
31ed0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
31ee0 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
31ef0 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
31f00 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
31f10 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
31f20 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
31f30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
31f40 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
31f50 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
31f60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31f70 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
31f80 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
31f90 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
31fa0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
31fb0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
31fc0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
31fd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
31fe0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
31ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32000 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
32010 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
32020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
32030 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
32040 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
32050 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
32060 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32070 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
32080 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
32090 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
320a0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
320b0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
320c0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
320d0 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
320e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
320f0 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20  nt flags =      
32100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32110 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  VFS flags to ope
32120 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
32130 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  /.          SQLI
32140 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32150 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
32160 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
32170 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
32180 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  e ? .           
32190 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
321a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
321b0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
321c0 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
321d0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
321e0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
321f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66          );.  #if
32200 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
32210 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
32220 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32230 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
32240 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
32250 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
32260 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
32270 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
32280 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
32290 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73         );.  #els
322a0 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  e.        rc = s
322b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
322c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
322d0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
322e0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23  , flags, 0);.  #
322f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
32300 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
32310 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
32320 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32330 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
32340 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
32350 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
32360 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
32370 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
32380 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
32390 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
323a0 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
323b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
323c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
323d0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
323e0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
323f0 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
32400 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
32410 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
32420 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
32430 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
32440 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
32450 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
32460 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
32470 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
32480 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
32490 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
324a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
324b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
324c0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
324d0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
324e0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
324f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32500 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
32510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32520 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32530 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
32540 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
32550 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
32560 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
32570 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
32580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
32590 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
325a0 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
325b0 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
325c0 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
325d0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
325e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
325f0 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
32600 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
32610 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
32620 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
32630 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
32640 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
32650 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
32660 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32670 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
32680 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
32690 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
326a0 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
326b0 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
326c0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
326d0 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
326e0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
326f0 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
32700 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
32710 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
32720 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
32730 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
32740 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
32750 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
32760 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
32770 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
32780 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
32790 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
327a0 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
327b0 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
327c0 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
327d0 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
327e0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
327f0 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
32800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
32810 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
32820 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
32830 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
32840 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
32850 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
32860 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
32870 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
32880 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
32890 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
328a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
328b0 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
328c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
328d0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
328e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
328f0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
32900 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
32910 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
32920 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
32930 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
32940 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
32950 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
32960 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
32970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32980 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
32990 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
329a0 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
329b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
329c0 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
329d0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
329e0 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
329f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32a00 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
32a10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32a20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
32a30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
32a40 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
32a50 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
32a60 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
32a70 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
32a80 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32a90 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
32aa0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
32ab0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32ac0 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
32ad0 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
32ae0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
32af0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
32b00 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32b10 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
32b20 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
32b30 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
32b40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
32b50 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
32b60 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
32b70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32b90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
32ba0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
32bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
32bc0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
32bd0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
32be0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32bf0 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
32c00 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
32c10 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
32c20 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
32c30 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
32c40 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
32c50 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
32c60 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
32c70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
32c80 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
32c90 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
32ca0 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
32cb0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
32cc0 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
32cd0 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
32ce0 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
32cf0 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
32d00 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
32d10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32d20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
32d30 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
32d40 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
32d50 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
32d60 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
32d70 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
32d80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32d90 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
32da0 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
32db0 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
32dc0 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
32dd0 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
32de0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32df0 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
32e00 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
32e10 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
32e20 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
32e30 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
32e40 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
32e50 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
32e60 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
32e70 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
32e80 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
32e90 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
32ea0 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
32eb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
32ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
32ed0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
32ee0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
32ef0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
32f00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
32f20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
32f40 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
32f50 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
32f60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
32f70 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
32f80 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
32f90 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
32fa0 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44  CKED or CACHEMOD
32fb0 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69  .      ** when i
32fc0 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  t has an open tr
32fd0 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
32fe0 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72  ever to DBMOD or
32ff0 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20   FINISHED..     
33000 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
33010 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61  use in those sta
33020 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
33030 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
33040 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
33050 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63  ansactions may c
33060 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
33070 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e  e sub-journal in
33080 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
33090 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
330a0 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74  s well as into t
330b0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
330c0 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
330d0 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20  correct in .    
330e0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20    ** WAL mode.. 
330f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
33100 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33110 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
33120 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ED;.      pPager
33130 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
33140 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
33150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
33160 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ileSize = pPager
33170 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
33180 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
33190 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
331a0 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
331b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
331c0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  0;.    }..    as
331d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
331e0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
331f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
33200 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DER );.    asser
33210 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33220 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
33230 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
33240 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61  _LOCKED );.    a
33250 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
33260 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
33270 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ) );.  }..  PAGE
33280 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
33290 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
332a0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
332b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
332c0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
332d0 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
332e0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
332f0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33300 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
33310 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
33320 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
33330 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
33340 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
33350 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
33360 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
33370 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
33380 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
33390 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
333a0 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
333b0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
333c0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
333d0 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
333e0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
333f0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
33400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
33410 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
33420 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
33430 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
33440 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
33450 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
33460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33470 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
33480 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
33490 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
334a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
334b0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
334c0 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
334d0 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
334e0 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
334f0 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
33500 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
33510 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
33520 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
33530 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
33540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33550 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33560 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
33570 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
33580 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
33590 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
335a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
335b0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
335c0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
335d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
335e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
335f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  );..  /* If an e
33600 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
33610 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65  eviously detecte
33620 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61  d, report the sa
33630 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67  me error.  ** ag
33640 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ain. This should
33650 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74   not happen, but
33660 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69   the check provi
33670 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  des robustness. 
33680 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
33690 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
336a0 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
336b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
336c0 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
336d0 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
336e0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
336f0 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
33700 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
33710 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
33720 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
33730 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
33740 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
33750 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
33760 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
33770 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
33780 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  Pg);..  /* The j
33790 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
337a0 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20  s to be opened. 
337b0 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
337c0 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
337d0 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  dy.  ** obtained
337e0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
337f0 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68  ocks to begin th
33800 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
33810 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a  ion, but the.  *
33820 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
33830 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74  al might not yet
33840 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69   be open. Open i
33850 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73  t now if this is
33860 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a   the case..  **.
33870 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e    ** This is don
33880 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
33890 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
338a0 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65  keDirty() on the
338b0 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68   page. .  ** Oth
338c0 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65  erwise, if it we
338d0 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61  re done after ca
338e0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
338f0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20  cheMakeDirty(), 
33900 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  then.  ** an err
33910 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61  or might occur a
33920 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75  nd the pager wou
33930 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49  ld end up in WRI
33940 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
33950 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73  .  ** with pages
33960 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
33970 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
33980 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
33990 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
339a0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
339b0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
339c0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
339d0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
339e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
339f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
33a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33a10 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
33a20 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
33a30 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
33a40 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
33a50 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ger) );..  /* Ma
33a60 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
33a70 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
33a80 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
33a90 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
33aa0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
33ab0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
33ac0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
33ad0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
33ae0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
33af0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
33b00 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
33b10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
33b20 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73  (pPg) ){.    ass
33b30 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
33b40 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  l(pPager) );.  }
33b50 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
33b60 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
33b70 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
33b80 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
33b90 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
33ba0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
33bb0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
33bc0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
33bd0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
33be0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
33bf0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
33c00 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
33c10 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
33c20 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
33c30 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
33c40 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61  rnal(pPg) && !pa
33c50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33c60 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
33c70 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
33c80 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
33c90 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
33ca0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
33cb0 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70  Size && isOpen(p
33cc0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
33cd0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
33ce0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
33cf0 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20  pData2;.        
33d00 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
33d10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
33d20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
33d30 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
33d40 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
33d50 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
33d60 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
33d70 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
33d80 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
33d90 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
33da0 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
33db0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
33dc0 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
33dd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
33de0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
33df0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
33e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
33e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
33e20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
33e30 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43  Off );.        C
33e40 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
33e50 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
33e60 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
33e70 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
33e80 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
33e90 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
33ea0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
33eb0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
33ec0 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
33ed0 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
33ee0 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72  ccurs while jour
33ef0 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
33f00 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
33f10 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
33f20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
33f30 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
33f40 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
33f50 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
33f60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
33f70 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
33f80 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
33f90 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
33fa0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
33fb0 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
33fc0 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
33fd0 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
33fe0 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
33ff0 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
34000 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
34010 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
34020 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
34030 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
34040 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
34050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
34060 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
34070 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20  DR_NEED_SYNC;.. 
34080 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
34090 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
340a0 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e  jfd, iOff, pPg->
340b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
340c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
340d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
340e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
340f0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
34100 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
34110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34120 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20   iOff+4);.      
34130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34140 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
34150 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
34160 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
34170 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
34180 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
34190 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
341a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
341b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
341c0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
341d0 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
341e0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
341f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
34200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
34210 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34220 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34230 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
34240 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
34250 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
34260 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
34270 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
34280 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
34290 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
342a0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
342b0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
342c0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
342d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
342e0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
342f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
34300 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
34310 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
34320 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
34330 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
34340 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
34350 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34360 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
34370 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34380 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
34390 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
343a0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
343b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
343c0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
343d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
343e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
343f0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
34400 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34410 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
34420 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34430 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
34440 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
34450 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
34460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34480 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
344a0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
344b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
344c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
344d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
344e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
344f0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
34500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34510 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
34520 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
34530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
34540 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
34550 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
34560 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
34570 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
34580 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
34590 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
345a0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
345b0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
345c0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
345d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
345e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
345f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
34600 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
34610 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
34620 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
34630 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
34640 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
34650 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
34660 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
34670 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34680 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
34690 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
346a0 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
346b0 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
346c0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
346d0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
346e0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
346f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
34700 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
34710 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34720 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
34730 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
34740 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
34750 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
34760 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
34770 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
34780 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
34790 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
347a0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
347b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
347c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
347d0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
347e0 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
347f0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
34800 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
34810 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
34820 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
34830 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
34840 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
34850 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
34860 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
34870 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
34880 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
34890 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
348a0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
348b0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
348c0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
348d0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
348e0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
348f0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
34900 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
34910 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
34920 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
34930 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
34940 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
34950 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
34960 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
34970 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
34980 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
34990 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
349a0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
349b0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
349c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
349d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
349e0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
349f0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
34a00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
34a10 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
34a20 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
34a30 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
34a40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
34a50 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
34a60 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
34a70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
34a80 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
34a90 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
34aa0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
34ab0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
34ac0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
34ad0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
34ae0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
34af0 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ze);..  assert( 
34b00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
34b10 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
34b20 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
34b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
34b40 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
34b50 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
34b60 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
34b70 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e  ger) );..  if( n
34b80 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
34b90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
34ba0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
34bb0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
34bc0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
34bd0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
34be0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
34c00 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
34c10 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
34c20 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
34c30 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b    int nPage = 0;
34c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
34c50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
34c60 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
34c70 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
34c80 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
34c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
34ca0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
34cb0 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
34cc0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
34cd0 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
34ce0 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
34cf0 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
34d00 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
34d10 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e  Spill flag to 1.
34d20 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
34d30 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
34d40 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  .    ** a journa
34d50 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  l header to be w
34d60 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
34d70 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
34d80 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69  ed by.    ** thi
34d90 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
34da0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
34db0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
34dc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
34dd0 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29  otSyncSpill==0 )
34de0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
34df0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a  NotSyncSpill++;.
34e00 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
34e10 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
34e20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
34e30 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
34e40 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
34e50 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
34e60 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
34e70 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
34e80 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
34e90 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
34ea0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
34eb0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
34ec0 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
34ed0 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
34ee0 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
34ef0 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
34f00 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e  ;..    nPageCoun
34f10 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  t = pPager->dbSi
34f20 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  ze;.    if( pPg-
34f30 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
34f40 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
34f50 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
34f60 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
34f70 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
34f80 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
34f90 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
34fa0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
34fb0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
34fc0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
34fd0 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
34fe0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
34ff0 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
35000 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
35010 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
35020 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
35030 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
35040 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35050 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
35060 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
35070 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
35080 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
35090 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
350a0 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
350b0 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
350c0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
350d0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
350e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
350f0 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
35100 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35120 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
35130 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
35140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
35150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35160 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
35170 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
35180 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
35190 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
351a0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
351b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
351c0 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
351d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
351e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
351f0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35200 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
35210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35220 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
35230 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
35240 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
35250 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
35260 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
35270 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
35280 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
35290 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
352a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
352b0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
352c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
352d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
352e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
352f0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
35300 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
35310 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
35320 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
35330 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
35340 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
35350 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
35360 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
35370 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
35380 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
35390 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
353a0 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
353b0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
353c0 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
353d0 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
353e0 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
353f0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
35400 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
35410 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
35420 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
35430 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35440 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79  ITE_OK && needSy
35450 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
35460 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
35470 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
35480 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  <nPage; ii++){. 
35490 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
354a0 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
354b0 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
354c0 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
354d0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
354e0 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
354f0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
35500 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
35510 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35520 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
35540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35550 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
35560 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ill==1 );.    pP
35570 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
35580 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  pill--;.  }else{
35590 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
355a0 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
355b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
355c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
355d0 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
355e0 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
355f0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
35600 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
35610 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
35620 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
35630 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
35640 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
35650 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
35660 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
35670 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
35680 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
35690 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
356a0 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
356b0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
356c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
356d0 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
356e0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
356f0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
35700 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
35710 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
35720 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
35730 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
35740 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
35750 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
35760 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
35770 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
35780 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
35790 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
357a0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
357b0 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
357c0 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
357d0 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
357e0 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
357f0 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
35800 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
35810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
35820 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
35830 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
35840 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
35850 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
35860 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
35870 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
35880 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
35890 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
358a0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
358b0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
358c0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
358d0 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
358e0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
358f0 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
35900 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
35910 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
35920 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
35930 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
35940 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
35950 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
35960 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35970 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
35980 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
35990 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
359a0 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
359b0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
359c0 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
359d0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
359e0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
359f0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
35a00 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
35a10 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
35a20 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
35a30 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
35a40 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
35a50 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
35a60 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
35a70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
35a80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
35a90 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
35aa0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
35ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a  database file .*
35ac0 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
35ad0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d  , stored as a 4-
35ae0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
35af0 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67  integer starting
35b00 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66   at .** byte off
35b10 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61  set 24 of the pa
35b20 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73  ger file.  The s
35b30 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20  econdary change 
35b40 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32  counter at.** 92
35b50 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64   is also updated
35b60 2c 20 61 73 20 69 73 20 74 68 65 20 53 51 4c 69  , as is the SQLi
35b70 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
35b80 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
35b90 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73 20 6f  **.** But this o
35ba0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
35bb0 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
35bc0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
35bd0 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20  is false..** To 
35be0 61 76 6f 69 64 20 65 78 63 65 73 73 20 63 68 75  avoid excess chu
35bf0 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 31 2c  rning of page 1,
35c00 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e 6c 79   the update only
35c10 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a   happens once..*
35c20 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70  * See also the p
35c30 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
35c40 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75 74 69  ecounter() routi
35c50 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61 6e 20  ne that does an 
35c60 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61  .** unconditiona
35c70 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  l update of the 
35c80 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 73 2e  change counters.
35c90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
35ca0 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
35cb0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
35cc0 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61  is is done by ca
35cd0 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
35ce0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
35cf0 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f   page 1, then mo
35d00 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
35d10 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  ents of the.** p
35d20 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69  age data. In thi
35d30 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20  s case the file 
35d40 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20  will be updated 
35d50 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
35d60 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
35d70 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
35d80 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74  .** The isDirect
35d90 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e  Mode flag may on
35da0 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
35db0 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
35dc0 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
35dd0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
35de0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
35df0 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
35e00 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
35e10 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
35e20 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
35e30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35e40 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
35e50 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
35e60 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
35e70 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
35e80 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
35e90 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
35ea0 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
35eb0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
35ec0 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
35ed0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
35ee0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
35ef0 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
35f00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35f10 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
35f20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35f30 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
35f40 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
35f50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35f60 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
35f70 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
35f80 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35f90 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
35fa0 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
35fb0 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
35fc0 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
35fd0 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
35fe0 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
35ff0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36000 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
36010 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
36020 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
36030 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
36040 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
36050 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
36060 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
36070 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
36080 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
36090 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
360a0 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
360b0 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
360c0 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
360d0 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
360e0 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
360f0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
36100 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
36110 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
36120 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
36130 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
36140 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
36150 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
36160 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
36170 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
36180 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
36190 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
361a0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
361b0 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
361c0 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74  _MODE 0.  assert
361d0 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d  ( isDirectMode==
361e0 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
361f0 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74  RAMETER(isDirect
36200 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64  Mode);.#else.# d
36210 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
36220 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23  E isDirectMode.#
36230 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50  endif..  if( !pP
36240 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
36250 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
36260 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
36270 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
36280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36290 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
362a0 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61 73  age 1 */..    as
362b0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
362c0 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
362d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
362e0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
362f0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
36300 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
36310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36320 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
36330 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
36340 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
36350 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
36360 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
36370 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
36380 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
36390 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
363a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
363b0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
363c0 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
363d0 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
363e0 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
363f0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
36400 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
36410 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
36420 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
36430 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
36440 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
36450 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
36460 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
36470 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
36480 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
36490 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
364a0 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
364b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
364c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
364d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
364e0 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
364f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  OK ){.      /* A
36510 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75  ctually do the u
36520 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68 61  pdate of the cha
36530 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge counter */. 
36540 20 20 20 20 20 70 61 67 65 72 5f 77 72 69 74 65       pager_write
36550 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
36560 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f  PgHdr);..      /
36570 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
36580 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
36590 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
365a0 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
365b0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
365c0 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
365d0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
365e0 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20   void *zBuf;.   
365f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
36600 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
36610 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  0 );.        COD
36620 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48  EC2(pPager, pPgH
36630 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c  dr->pData, 1, 6,
36640 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
36650 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  , zBuf);.       
36660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36680 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
36690 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
366a0 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
366b0 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
366c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
366d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
366e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
366f0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
36700 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
36710 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
36720 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
36730 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
36740 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
36750 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
36760 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
36770 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
36780 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36790 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
367a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
367b0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
367c0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69  abase file to di
367d0 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
367e0 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
367f0 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f  y databases.** o
36800 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
36810 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
36820 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
36830 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
36840 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  if called on a p
36850 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
36860 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
36870 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
36880 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
36890 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
368a0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
368b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
368c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
368d0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
368e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
368f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
36900 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
36910 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
36920 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  EMDB );.    rc =
36930 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
36940 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
36950 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
36960 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
36970 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
36980 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
36990 4d 44 42 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  MDB );.    sqlit
369a0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
369b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
369c0 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d  TE_FCNTL_SYNC_OM
369d0 49 54 54 45 44 2c 20 28 76 6f 69 64 20 2a 29 26  ITTED, (void *)&
369e0 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
369f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
36a00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
36a10 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
36a20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72  while a write-tr
36a30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
36a40 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61  ive in.** rollba
36a50 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65  ck. If the conne
36a60 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20  ction is in WAL 
36a70 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20  mode, this call 
36a80 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20  is a no-op. .** 
36a90 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
36aa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65  e connection doe
36ab0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61  s not already ha
36ac0 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ve an EXCLUSIVE 
36ad0 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
36ae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
36af0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
36b00 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e  e to obtain one.
36b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
36b20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
36b30 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20  already held or 
36b40 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  the attempt to o
36b50 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73  btain it is.** s
36b60 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68  uccessful, or th
36b70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
36b80 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c  in WAL mode, SQL
36b90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
36ba0 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
36bb0 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
36bc0 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54  BUSY or an SQLIT
36bd0 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
36be0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
36bf0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
36c00 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
36c10 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a  siveLock(Pager *
36c20 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
36c30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36c50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36c60 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a  RITER_CACHEMOD .
36c70 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36c80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36c90 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20  WRITER_DBMOD .  
36ca0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
36cb0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36cc0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29  ITER_LOCKED .  )
36cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
36ce0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36cf0 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20  Pager) );.  if( 
36d00 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70  0==pagerUseWal(p
36d10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
36d20 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
36d30 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
36d40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
36d50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36d60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
36d70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36d80 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
36d90 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
36da0 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
36db0 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
36dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
36dd0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
36de0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
36df0 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
36e00 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
36e10 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
36e20 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
36e30 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
36e40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
36e50 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
36e60 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
36e70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
36e80 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
36e90 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
36ea0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
36eb0 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
36ec0 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
36ed0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
36ee0 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
36ef0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
36f00 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
36f10 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
36f20 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
36f30 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
36f40 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
36f50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
36f60 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
36f70 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
36f80 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
36f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
36fa0 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
36fb0 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
36fc0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
36fd0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
36fe0 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
36ff0 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
37000 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
37010 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
37020 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
37030 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
37040 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
37050 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
37060 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
37070 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
37080 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
37090 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
370a0 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
370b0 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
370c0 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
370d0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
370e0 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
370f0 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
37100 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
37110 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
37120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37130 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
37140 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
37150 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
37160 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
37170 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
37180 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
37190 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
371a0 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
371b0 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
371c0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
371d0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
371e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
371f0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
37200 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
37210 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
37220 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
37230 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
37240 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
37250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
37260 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
37270 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
37280 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
37290 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
372a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
372b0 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
372c0 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
372d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
372e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
372f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
37300 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
37310 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37320 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37330 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
37340 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37350 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37360 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
37370 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37380 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37390 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
373a0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
373b0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
373c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
373d0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
373e0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
373f0 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   If a prior erro
37400 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f  r occurred, repo
37410 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67  rt that error ag
37420 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ain. */.  if( NE
37430 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
37440 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
37450 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
37460 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
37470 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
37480 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
37490 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
374a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
374b0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
374c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
374d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64  );..  /* If no d
374e0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
374f0 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20  have been made, 
37500 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
37510 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
37520 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
37530 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65  ER_CACHEMOD ) re
37540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37550 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
37560 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
37570 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
37580 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
37590 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
375a0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
375b0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
375c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
375d0 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
375e0 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
375f0 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
37600 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
37610 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
37620 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
37630 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
37640 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
37650 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
37660 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61  else{.    if( pa
37670 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
37680 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  ) ){.      PgHdr
37690 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
376a0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
376b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
376c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
376d0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  st ){.        rc
376e0 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
376f0 73 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c  s(pPager, pList,
37700 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c   pPager->dbSize,
37710 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   1, .           
37720 20 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79   (pPager->fullSy
37730 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e  nc ? pPager->syn
37740 63 46 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20  cFlags : 0).    
37750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
37760 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37780 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
37790 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
377a0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
377b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
377c0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
377d0 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
377e0 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
377f0 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
37800 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  w it.      ** do
37810 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
37820 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
37830 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
37840 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
37850 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  .      ** was en
37860 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
37870 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
37880 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
37890 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20  eets the .      
378a0 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
378b0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
378c0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20  peration: .     
378d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
378e0 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * The file-syste
378f0 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
37900 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
37910 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  erty for.      *
37920 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
37930 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
37940 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20   and .      **  
37950 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
37960 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
37970 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
37980 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
37990 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
379a0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
379b0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
379c0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
379d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
379e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
379f0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
37a00 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
37a10 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
37a20 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
37a30 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
37a40 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
37a50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
37a60 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
37a70 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a  e change.      *
37a80 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e  * counter in 'in
37a90 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66  direct-mode'. If
37aa0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
37ab0 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  n is compiled in
37ac0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73   but.      ** is
37ad0 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20   not applicable 
37ae0 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  to this transact
37af0 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ion, call sqlite
37b00 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29  3JournalCreate()
37b10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  .      ** to mak
37b20 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
37b30 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
37b40 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
37b50 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
37b60 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
37b70 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
37b80 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
37b90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e  hange-counter in
37ba0 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20   indirect.      
37bb0 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20  ** mode. .      
37bc0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  **.      ** Othe
37bd0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
37be0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
37bf0 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
37c00 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20  pplicable,.     
37c10 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61   ** then call pa
37c20 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
37c30 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
37c40 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
37c50 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  unter.      ** i
37c60 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e  n 'direct' mode.
37c70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
37c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
37c90 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20  ill never be.   
37ca0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f     ** created fo
37cb0 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
37cc0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23  on..      */.  #
37cd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
37ce0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
37cf0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
37d00 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  g;.      assert(
37d10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
37d20 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
37d30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
37d40 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
37d50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
37d60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
37d70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
37d80 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37d90 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
37da0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
37db0 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
37dc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
37dd0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
37de0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
37df0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
37e00 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  r) .       && pP
37e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
37e20 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
37e30 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28  .       && (0==(
37e40 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
37e50 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
37e60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
37e70 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
37e80 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
37e90 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
37ea0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
37eb0 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
37ec0 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
37ed0 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
37ee0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
37ef0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
37f00 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
37f10 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
37f20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20  page 1 .        
37f30 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
37f40 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
37f50 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
37f60 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
37f70 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63          ** direc
37f80 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
37f90 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
37fa0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
37fb0 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a  write .        *
37fc0 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  * property of th
37fd0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
37fe0 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65  em, this is safe
37ff0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
38000 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
38010 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
38020 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
38030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
38040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38050 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
38060 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
38070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38090 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
380a0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
380b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
380c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
380d0 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20   #else.      rc 
380e0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
380f0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
38100 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a  r, 0);.  #endif.
38110 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
38120 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
38130 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
38140 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f  exit;.  .      /
38150 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
38160 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
38170 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
38180 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
38190 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  ges.      ** bei
381a0 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
381b0 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
381c0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
381d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
381e0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69      ** file. Thi
381f0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
38200 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
38210 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   mode..      **.
38220 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20        ** Before 
38230 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65  reading the page
38240 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
38250 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ers larger than 
38260 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75  the .      ** cu
38270 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
38280 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74  ager.dbSize, set
38290 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20   dbSize back to 
382a0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
382b0 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20  ** that it took 
382c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
382d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
382e0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
382f0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74        ** calls t
38300 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
38310 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
38320 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
38330 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  of .      ** rea
38340 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74  ding data from t
38350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
38360 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
38370 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
38380 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
38390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
383a0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
383b0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20  rigSize .       
383c0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
383d0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
383e0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20  URNALMODE_OFF.  
383f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50      ){.        P
38400 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20  gno i;          
38410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38420 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
38430 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
38440 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
38450 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
38460 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
38470 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
38480 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
38490 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
384a0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
384b0 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
384c0 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
384d0 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ize */ .        
384e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
384f0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
38500 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ize;.        for
38510 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
38520 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
38530 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
38540 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
38550 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
38560 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
38570 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
38580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50  ){.            P
38590 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20  gHdr *pPage;    
385a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
385b0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
385c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
385d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
385e0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
385f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
38600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38610 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
38620 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
38630 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
38640 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
38650 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
38660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
38670 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
38680 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
38690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
386a0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
386b0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
386c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
386d0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
386e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
386f0 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23  ze;.      } .  #
38700 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f  endif.  .      /
38710 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
38720 65 72 20 6a 6f 75 72 6e