/ Hex Artifact Content
Login

Artifact e7c940ef4a3bad34c9c44ac429257fcf301b828f:


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 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7200: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
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 66 6f 72 20 77 61  SYNC_FULL for wa
7230: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
7240: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7260: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7270: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7280: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
72a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
72b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
72c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
72d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
72e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
72f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
7300: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ase */.  u8 memD
7310: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7330: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
7340: 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a   I/O */..  /****
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ******.  ** The 
73a0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
73b0: 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63  contains those c
73c0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61  lass members tha
73d0: 74 20 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a  t change during.
73e0: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65    ** routine ope
73f0: 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65  rtion.  Class me
7400: 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69  mbers not in thi
7410: 73 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68  s block are eith
7420: 65 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68  er fixed.  ** wh
7430: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
7440: 66 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72  first created or
7450: 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67   else only chang
7460: 65 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  e when there is 
7470: 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61  a.  ** significa
7480: 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28  nt mode change (
7490: 73 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67  such as changing
74a0: 20 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20   the page_size, 
74b0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20  locking_mode,.  
74c0: 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  ** or the journa
74d0: 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61  l_mode).  From a
74e0: 6e 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65  nother view, the
74f0: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7500: 20 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74   describe.  ** t
7510: 68 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68  he "state" of th
7520: 65 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f  e pager, while o
7530: 74 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65  ther class membe
7540: 72 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a  rs describe the.
7550: 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74    ** "configurat
7560: 69 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65  ion" of the page
7570: 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74  r..  */.  u8 eSt
7580: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
7590: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
75a0: 74 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44  tate (OPEN, READ
75b0: 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  ER, WRITER_LOCKE
75c0: 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f  D..) */.  u8 eLo
75d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
75e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
75f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61   lock held on da
7600: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7610: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
7620: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
7630: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
7640: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
7650: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
7660: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7680: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
7690: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
76a0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
76b0: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
76c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
76d0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
76e0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
76f0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
7700: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
7710: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
7720: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
7730: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
7740: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7750: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7760: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7770: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7780: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e  ournals */.  Pgn
7790: 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  o dbSize;       
77a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
77b0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
77c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
77d0: 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65   Pgno dbOrigSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68  dbSize before th
7800: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
7810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20  ction */.  Pgno 
7820: 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  dbFileSize;     
7830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7840: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7860: 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53  /.  Pgno dbHintS
7870: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7880: 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64 20  /* Value passed 
7890: 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  to FCNTL_SIZE_HI
78a0: 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  NT call */.  int
78b0: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
78d0: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
78e0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
78f0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
7900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7910: 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  ages journalled 
7920: 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61  since last j-hea
7930: 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  der written */. 
7940: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
7970: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
7980: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
7990: 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20  u32 nSubRec;    
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
79b0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
79c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d   written to sub-
79d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74  journal */.  Bit
79e0: 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b  vec *pInJournal;
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
7a00: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
7a10: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
7a20: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  e file */.  sqli
7a30: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
7a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a50: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64  descriptor for d
7a60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
7a70: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
7a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7a90: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7aa0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
7ab0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ac0: 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  sjfd;         /*
7ad0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ae0: 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   for sub-journal
7af0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7b00: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
7b10: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69    /* Current wri
7b20: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
7b30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
7b40: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
7b50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
7b60: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
7b70: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
7b80: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71  l header */.  sq
7b90: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
7ba0: 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69  ackup;    /* Poi
7bb0: 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20  nter to list of 
7bc0: 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70  ongoing backup p
7bd0: 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61  rocesses */.  Pa
7be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
7bf0: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
7c00: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
7c10: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
7c20: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
7c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7c40: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
7c50: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
7c60: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7c70: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7c80: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7c90: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7ca0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 2f  e changes */.  /
7cb0: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7cc0: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7cd0: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7ce0: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d30: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7d60: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7d70: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7d80: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
7d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
7db0: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
7dc0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
7dd0: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7df0: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
7e00: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
7e10: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
7e40: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
7e50: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
7e60: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e80: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
7e90: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
7ea0: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
7eb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
7ec0: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
7ed0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
7ee0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
7ef0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
7f00: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
7f10: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
7f20: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
7f30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7f50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7f60: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
7f70: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
7f90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7fa0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
7fb0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
7fc0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
7fd0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
7fe0: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
7ff0: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8000: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8010: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8020: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
8030: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8050: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 20  otal cache hits 
8060: 61 6e 64 20 6d 69 73 73 65 73 20 2a 2f 0a 23 69  and misses */.#i
8070: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8080: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
8090: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
80a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
80b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
80c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
80d0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
80e0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
80f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8100: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8110: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8120: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8130: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
8140: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
8150: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
8160: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
8170: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
8180: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8190: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
81a0: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
81b0: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
81c0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
81d0: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
81f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8200: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8210: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8230: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
8240: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
8250: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
8260: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
8270: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
8280: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8290: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
82a0: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
82b0: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
82c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
82d0: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
82e0: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
82f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8300: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8320: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8330: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
8340: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
8350: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8370: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
8380: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8390: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
83a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
83b0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
83c0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
83d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
83e0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
83f0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8400: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8410: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8420: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8430: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8440: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8450: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8460: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8470: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8480: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8490: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
84a0: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
84b0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
84c0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
84d0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
84e0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
84f0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8500: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8510: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8520: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8530: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8540: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8550: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8560: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8570: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8580: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8590: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
85a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
85b0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
85c0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
85d0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
85e0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
85f0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8600: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8610: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8620: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8630: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8640: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8650: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8660: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8670: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8680: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8690: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
86a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
86b0: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
86c0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
86d0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
86e0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
86f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8700: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8710: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8720: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8730: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8750: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8760: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8770: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8780: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8790: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
87a0: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
87b0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
87c0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
87d0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
87e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
87f0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8800: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8810: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8820: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8830: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8840: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8850: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8860: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8870: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8880: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8890: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
88a0: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
88b0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
88c0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
88d0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
88e0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
88f0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8900: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8910: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8920: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8930: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8940: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8950: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8960: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
8970: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
8980: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
8990: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
89a0: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
89b0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
89c0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
89d0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
89e0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
89f0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8a00: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8a10: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8a20: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8a30: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
8a40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
8a50: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
8a60: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
8a70: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
8a80: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
8a90: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8aa0: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8ab0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8ac0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8ad0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8ae0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8af0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8b00: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8b20: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8b30: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8b40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8b50: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8b60: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8b70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8b80: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8b90: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8ba0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8bb0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8bc0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8bd0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8be0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8bf0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8c00: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8c10: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8c20: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8c30: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8c40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8c50: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8c60: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8c70: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8c80: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8c90: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8ca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8cb0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8cc0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8cd0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8ce0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8cf0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8d00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8d10: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8d20: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8d30: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8d40: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8d50: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8d60: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8d70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8d80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8d90: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8da0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8db0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8dc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8dd0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8de0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8df0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8e00: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8e10: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8e20: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8e30: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8e40: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8e50: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8e60: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8e70: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8e80: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8e90: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8ea0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8eb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8ec0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8ed0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8ee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8ef0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8f00: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8f10: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8f20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8f30: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8f40: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8f50: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8f60: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8f70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8f80: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8f90: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8fa0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8fb0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8fc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8fd0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8fe0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8ff0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
9000: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9010: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9020: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9030: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9040: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9050: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9060: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9070: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9090: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
90a0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
90b0: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
90c0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
90d0: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
90e0: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
90f0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
9100: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
9110: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
9120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9130: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9140: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9150: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9160: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9170: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9180: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9190: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
91a0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
91b0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
91c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
91d0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
91e0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
91f0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9200: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9210: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
9220: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9230: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9240: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9260: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9270: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9280: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9290: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
92a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
92b0: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
92c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
92d0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
92e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
92f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9300: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9330: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9340: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9350: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9360: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9370: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9380: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9390: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
93a0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
93b0: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
93c0: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
93d0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
93e0: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
93f0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9400: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9410: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9420: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9430: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9440: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9460: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9470: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9480: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9490: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
94a0: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
94b0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
94c0: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
94d0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
94e0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
94f0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9500: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9510: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9520: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9530: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9540: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9550: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9570: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9580: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9590: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
95a0: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
95b0: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
95c0: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
95d0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
95e0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
95f0: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9600: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9610: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9620: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9630: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9640: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9650: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9660: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9670: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9680: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9690: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
96a0: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
96b0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
96d0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
96e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
96f0: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9700: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9710: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9720: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9730: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9740: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9750: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9760: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9770: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9780: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9790: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
97a0: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
97b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
97c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
97d0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
97e0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
97f0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9800: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9810: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9820: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9830: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9840: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9850: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9860: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9870: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9880: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9890: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
98a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
98b0: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
98c0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
98d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
98e0: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
98f0: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
9900: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
9910: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9920: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
9930: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
9940: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
9950: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
9960: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
9970: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9980: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
9990: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
99a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
99b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
99c0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
99d0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
99e0: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
99f0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9a00: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
9a10: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9a20: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
9a30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a40: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9a50: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9a60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9a70: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9a90: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
9aa0: 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c 6f  K || p->noReadlo
9ab0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ck );.      brea
9ac0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9ad0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9ae0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9af0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9b00: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9b10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9b20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9b30: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
9b40: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
9b50: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
9b60: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9b70: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ba0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
9bb0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
9bc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9bd0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9be0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
9bf0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c10: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9c20: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
9c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
9c50: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
9c60: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9c70: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9c80: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9c90: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ca0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9cb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9cc0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9cd0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9ce0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9cf0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9d00: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
9d10: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
9d20: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
9d30: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
9d40: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
9d50: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
9d60: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
9d70: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
9d80: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
9d90: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
9da0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
9db0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
9dc0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
9dd0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
9de0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
9df0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9e00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9e10: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9e20: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
9e30: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
9e40: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
9e50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9e60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9e80: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9e90: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9ea0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
9eb0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
9ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9ed0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9ee0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9ef0: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
9f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9f20: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
9f30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
9f40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f50: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
9f60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f70: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
9f80: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
9f90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fa0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fb0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fc0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
9fd0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
9fe0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9ff0: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a000: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a010: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a020: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a030: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a040: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a050: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a060: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a070: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a080: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a090: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a0a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0b0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a0c0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a0d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0f0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a110: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a120: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a140: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a170: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a180: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a190: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a1a0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a1b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a1c0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a1d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a1e0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a1f0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a200: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a210: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a220: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a230: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a240: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a250: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a260: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a270: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a280: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a290: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a2a0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a2b0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a2c0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a2d0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a2e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a2f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a300: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a310: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a320: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a330: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a340: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a370: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a380: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a390: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a3a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a3b0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a3c0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a3d0: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a3e0: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a3f0: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a400: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a410: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a420: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a430: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a440: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a450: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a460: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a470: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a480: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a490: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a4a0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a4b0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4c0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a4d0: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a4e0: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
a4f0: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
a500: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
a510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a520: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
a530: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
a540: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
a550: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
a560: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
a570: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
a580: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
a590: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
a5a0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
a5b0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
a5c0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
a5d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
a5e0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
a5f0: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
a600: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
a610: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
a620: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
a630: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
a640: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
a650: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
a660: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
a670: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
a680: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
a690: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
a6a0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
a6b0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6c0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
a6d0: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
a6e0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a6f0: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
a700: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
a710: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a720: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a730: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
a740: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
a750: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a760: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a770: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
a780: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
a790: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
a7b0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
a7c0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a7f0: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
a800: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
a810: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a820: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
a830: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
a840: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
a850: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
a860: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
a870: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
a880: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
a890: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
a8a0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
a8b0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a8d0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a8e0: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
a8f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a900: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
a910: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
a920: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a930: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
a940: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
a950: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
a960: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
a970: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
a980: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
a990: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
a9a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9b0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
a9c0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
a9d0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9e0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9f0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
aa00: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
aa10: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa30: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
aa40: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
aa50: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa60: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa70: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
aa80: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
aa90: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aaa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aab0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
aac0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
aad0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aae0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aaf0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
ab00: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
ab10: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
ab20: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
ab30: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
ab40: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
ab50: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
ab60: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
ab70: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
ab80: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
ab90: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
aba0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
abb0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
abc0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
abd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
abe0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
abf0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
ac00: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
ac10: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ac20: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
ac30: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
ac40: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
ac50: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
ac60: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
ac70: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
ac80: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
ac90: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
aca0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
acb0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
acc0: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
acd0: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
ace0: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
acf0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
ad00: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ad10: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
ad20: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ad30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
ad40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
ad50: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
ad60: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
ad70: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
ad80: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
ad90: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
ada0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
adb0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
adc0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
add0: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
ade0: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
adf0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
ae00: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
ae10: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
ae20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
ae30: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
ae40: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
ae50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ae60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
ae70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ae80: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
ae90: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
aea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
aeb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aec0: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
aed0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
aee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
aef0: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
af10: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
af20: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
af30: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
af40: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
af50: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
af60: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
af70: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
af80: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
af90: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
afa0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
afb0: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
afc0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
afd0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
afe0: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
aff0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b000: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b020: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b030: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b040: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b050: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
b060: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
b070: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
b080: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
b090: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
b0a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b0b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
b0c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
b0d0: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
b0e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b0f0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
b100: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
b110: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
b120: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
b130: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
b140: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
b150: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
b160: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
b170: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b180: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b190: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b1a0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
b1b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
b1c0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
b1d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b1e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
b1f0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
b200: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
b210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b220: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b230: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
b240: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
b250: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
b260: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
b270: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
b280: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
b290: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
b2a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b2b0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b2c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b2d0: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
b2e0: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
b2f0: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
b300: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
b310: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
b320: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
b330: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
b340: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
b350: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
b360: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
b370: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b380: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b390: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b3a0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b3b0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
b3c0: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
b3d0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b3e0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b3f0: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
b400: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b410: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
b420: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b430: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
b440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b450: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b470: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
b480: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b490: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
b4a0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
b4b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
b4c0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b4d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b4e0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
b4f0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
b500: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
b510: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
b520: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
b530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
b540: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
b550: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  k );.    rc = sq
b560: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
b570: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
b580: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
b590: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b5a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
b5b0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
b5c0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
b5d0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
b5e0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
b5f0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
b600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b610: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
b620: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b630: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b640: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b650: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
b660: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
b670: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
b680: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
b690: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
b6a0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
b6b0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b6c0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
b6d0: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
b6e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b6f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b700: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b710: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b720: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
b730: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b740: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
b750: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b760: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
b770: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
b780: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b790: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
b7a0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b7b0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
b7c0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
b7d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
b7e0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b7f0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b800: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b810: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b820: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b830: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
b840: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
b850: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
b860: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
b870: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
b880: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
b890: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
b8a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b8b0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
b8c0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
b8d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b8e0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
b8f0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
b900: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
b910: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
b920: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
b930: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
b940: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
b950: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
b960: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b980: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
b9a0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
b9b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
b9c0: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
b9d0: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
b9e0: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
b9f0: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
ba00: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ba10: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
ba20: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ba30: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
ba40: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ba50: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
ba60: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
ba70: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
ba80: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
ba90: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
baa0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bab0: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
bac0: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
bad0: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
bae0: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
baf0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ize..**.** The o
bb00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
bb10: 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c  lso always enabl
bb20: 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
bb30: 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a   files. It is.**
bb40: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
bb50: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
bb60: 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65  if pPager is ope
bb70: 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  ned on an in-mem
bb80: 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  ory.** database.
bb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
bba0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
bbb0: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
bbc0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
bbd0: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
bbe0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
bbf0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
bc00: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bc10: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
bc20: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
bc30: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
bc40: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
bc50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
bc60: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
bc70: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
bc80: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
bc90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bca0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
bcb0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
bcc0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
bcd0: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
bd00: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
bd10: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
bd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd30: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
bd40: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74   size */.    int
bd50: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a  * Page size */..
bd80: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
bd90: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
bda0: 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  ;.    dc = sqlit
bdb0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
bdc0: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
bdd0: 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  ->fd);.    nSect
bde0: 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63  or = pPager->sec
bdf0: 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50  torSize;.    szP
be00: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
be10: 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73  geSize;..    ass
be20: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
be30: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
be40: 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72  >>8));.    asser
be50: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
be60: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
be70: 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30  >>8));.    if( 0
be80: 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  ==(dc&(SQLITE_IO
be90: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
bea0: 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74  ge>>8)) || nSect
beb0: 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  or>szPage) ){.  
bec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bee0: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
bef0: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
bf00: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
bf10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
bf20: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
bf30: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
bf40: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
bf50: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
bf60: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
bf70: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
bf80: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
bf90: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
bfa0: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
bfb0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
bfc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
bfd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
bfe0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
bff0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c000: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c010: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c020: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c030: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c040: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c050: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c060: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c070: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c080: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c090: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c0a0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c0b0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c0c0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c0d0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c0e0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c0f0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c100: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c110: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c120: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c130: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c140: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c150: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c160: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c170: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c180: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c190: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c1a0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c1b0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c1c0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c1d0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c1e0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c1f0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c200: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c210: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c220: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c230: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c240: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c250: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c260: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c270: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c280: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c290: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c2a0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c2b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c2c0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c2d0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c2e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c2f0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c300: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c310: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c320: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c330: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c340: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c350: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c360: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c370: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c380: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c390: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c3a0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c3b0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c3c0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
c3d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
c3e0: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
c3f0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
c400: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
c410: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
c420: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
c430: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
c440: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
c450: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
c460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c470: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
c480: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c490: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
c4a0: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
c4b0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
c4c0: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
c4d0: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
c4e0: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
c4f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
c500: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
c510: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
c520: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c530: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
c540: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
c550: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
c560: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
c570: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
c580: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
c590: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
c5a0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
c5b0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
c5c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
c5d0: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
c5e0: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
c5f0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
c600: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
c610: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
c620: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
c630: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
c640: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c650: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
c660: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
c670: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
c680: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
c690: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
c6a0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
c6b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
c6c0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
c6e0: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
c6f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c700: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
c710: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
c720: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
c730: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
c740: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
c750: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
c760: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
c770: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
c780: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
c790: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
c7a0: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
c7b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
c7c0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
c7d0: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
c7e0: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
c7f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c800: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
c810: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
c820: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
c830: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
c840: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c850: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
c860: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
c880: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
c890: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c8a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c8b0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
c8c0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
c8d0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
c8e0: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
c8f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
c920: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
c950: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
c960: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
c970: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
c980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c990: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
c9a0: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
c9b0: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
c9c0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
c9e0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
c9f0: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
ca00: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca20: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
ca30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
ca40: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
ca50: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
ca60: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
ca70: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
ca80: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
ca90: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
caa0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cab0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
cac0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
cad0: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
cae0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
caf0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
cb00: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
cb10: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
cb20: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
cb30: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cb40: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cb50: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
cb60: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cb70: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb80: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
cb90: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
cba0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
cbb0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
cbc0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
cbd0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cbe0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cbf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
cc00: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
cc10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
cc20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
cc30: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
cc40: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
cc50: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc60: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
cc70: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
cc80: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
cc90: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
cca0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
ccb0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
ccc0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
ccd0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
cce0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
ccf0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
cd00: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
cd10: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
cd20: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
cd30: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
cd40: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
cd50: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
cd60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
cd70: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
cd80: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
cd90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
cda0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
cdb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
cdc0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
cdd0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
cde0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cdf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
ce00: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
ce10: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
ce20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
ce30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
ce40: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
ce50: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
ce60: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
ce70: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
ce80: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
ce90: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
cea0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
ceb0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
cec0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
ced0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
cee0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
cf80: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
cf90: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
cfa0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
cfb0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
cfc0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
cfd0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
cfe0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
cff0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d000: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d010: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d020: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d030: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d040: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d050: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d060: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d080: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d090: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d0b0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d0c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d0d0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d100: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d120: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d130: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d140: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d150: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d160: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d170: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d190: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d1a0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d1b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d1c0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d1d0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d1e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d1f0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d200: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d210: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d220: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d230: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d240: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d250: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d260: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d270: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d280: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d290: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d2a0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d2b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d2c0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d2d0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d2e0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d2f0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d300: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d310: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d320: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d330: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d340: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d350: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d360: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d370: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d380: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d390: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d3a0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d3b0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d3c0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d3d0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d3e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d3f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d400: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
d410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
d420: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
d430: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
d440: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d450: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d460: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d470: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
d480: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d490: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
d4a0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
d4b0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
d4c0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
d4d0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
d4e0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
d4f0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
d500: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d510: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d540: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
d550: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
d560: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
d570: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d580: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
d590: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
d5a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
d5b0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
d5c0: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
d5d0: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
d5e0: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
d5f0: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
d600: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
d610: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
d620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d630: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
d640: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
d650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
d660: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
d670: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
d680: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d690: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
d6a0: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
d6b0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
d6c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
d6d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d6e0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
d6f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
d700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
d710: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
d720: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
d730: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  LY|pPager->syncF
d740: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
d750: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
d760: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
d770: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
d780: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
d790: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
d7a0: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
d7b0: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
d7c0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
d7d0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
d7e0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
d7f0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
d800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d810: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
d820: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
d830: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
d840: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
d850: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
d860: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
d870: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
d880: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
d890: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d8a0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
d8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d8c0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
d8d0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
d910: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d920: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
d930: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
d940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d950: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d960: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
d970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d990: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d9a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d9b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
d9c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
d9d0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
d9e0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
d9f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
da00: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
da10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
da20: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
da30: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
da40: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
da60: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
da70: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
da80: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
da90: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
daa0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
dab0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
dac0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
dad0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
dae0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
daf0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
db00: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
db10: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
db20: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
db30: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
db40: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
db50: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
db60: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
db70: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
db80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
db90: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
dba0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
dbb0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
dbc0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
dbd0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
dbe0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
dbf0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
dc00: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
dc10: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
dc20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
dc50: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
dc60: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
dc70: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
dc80: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
dc90: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
dca0: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
dcb0: 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
dcc0: 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f  geSize;/* Size o
dcd0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
dce0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
dcf0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
dd20: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
dd30: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
dd40: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dd70: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
dd80: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
dd90: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
dda0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
ddb0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
ddc0: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
ddd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dde0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
ddf0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
de00: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
de10: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
de20: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
de30: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
de40: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
de50: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
de60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
de70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
de80: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
de90: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
dea0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
deb0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
dec0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
ded0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
dee0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
def0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
df00: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
df10: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
df20: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
df30: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
df40: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
df50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
df60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
df70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
df80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df90: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
dfa0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
dfb0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
dfc0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
dfd0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
dfe0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
dff0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
e000: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e010: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
e020: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
e030: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
e040: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
e050: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
e060: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
e070: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
e080: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
e090: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
e0a0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
e0b0: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
e0c0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
e0d0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
e0e0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
e0f0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
e100: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
e110: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
e120: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
e130: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
e140: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
e150: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e160: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
e170: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
e180: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
e190: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
e1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e1b0: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
e1c0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
e1d0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
e1e0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
e1f0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
e200: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
e210: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
e220: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e230: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
e240: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
e250: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
e260: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
e270: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
e280: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
e290: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e2a0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
e2b0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e2c0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
e2d0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
e2e0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
e2f0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
e300: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
e310: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
e320: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e330: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
e340: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
e350: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
e360: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
e370: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
e380: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e390: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
e3a0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3b0: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
e3c0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
e3d0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
e3e0: 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  c || (pPager->jo
e3f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e400: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e410: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
e420: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e430: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
e440: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
e450: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
e460: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
e470: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
e480: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
e490: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
e4a0: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
e4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
e4d0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
e4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
e4f0: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
e500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e510: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
e520: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
e530: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
e540: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
e550: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
e560: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
e570: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
e580: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
e590: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e5a0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e5b0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
e5c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
e5d0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
e5e0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
e5f0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e600: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e610: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
e620: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
e630: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
e640: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
e650: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
e660: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
e670: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e680: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e690: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
e6a0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
e6b0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
e6c0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e6d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e6e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
e6f0: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
e700: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
e710: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
e720: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
e730: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
e740: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
e750: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
e760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
e770: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
e780: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
e790: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
e7a0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
e7b0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
e7c0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
e7d0: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
e7e0: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
e7f0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
e800: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
e810: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e820: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
e830: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
e840: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
e850: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
e860: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
e870: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
e880: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
e890: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
e8a0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
e8b0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
e8c0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
e8d0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
e8e0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
e8f0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
e900: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
e910: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
e920: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
e930: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
e940: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
e950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
e960: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
e970: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
e980: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
e990: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
e9a0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
e9b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
e9c0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
e9d0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
e9e0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
e9f0: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
ea00: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
ea10: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
ea20: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
ea30: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
ea40: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
ea50: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
ea60: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
ea70: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
ea80: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
ea90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
eaa0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
eab0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
eac0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
ead0: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
eae0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
eaf0: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
eb00: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
eb10: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
eb20: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
eb30: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
eb40: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
eb50: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
eb60: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
eb70: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
eb80: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
eb90: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
eba0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
ebb0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
ebc0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
ebd0: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
ebe0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
ebf0: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
ec00: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
ec10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
ec20: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
ec30: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
ec40: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
ec50: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
ec60: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
ec70: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
ec80: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
ec90: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
eca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ecb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
ecc0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
ecd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ece0: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
ecf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ed00: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
ed10: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
ed20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ed30: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
ed40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
ed50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
ed60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
ed70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
ed80: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
ed90: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
eda0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
edb0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
edc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
edd0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
ede0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
edf0: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
ee00: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
ee10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ee20: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
ee30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ee40: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
ee50: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
ee60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
ee70: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
ee80: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
ee90: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
eea0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
eeb0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
eec0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
eed0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
eee0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
eef0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
ef00: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
ef10: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
ef20: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
ef30: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
ef40: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
ef50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
ef60: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
ef70: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
ef80: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
ef90: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
efa0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
efb0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
efc0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
efd0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
efe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
eff0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f000: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
f010: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f020: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
f030: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
f040: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
f050: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
f060: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
f070: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
f080: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f090: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
f0a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f0b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f0c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
f0d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
f0e0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
f0f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
f100: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
f110: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
f120: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
f130: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f140: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
f150: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
f160: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f190: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
f1a0: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
f1b0: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
f1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f1d0: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
f1e0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
f1f0: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
f200: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f230: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f240: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
f250: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
f260: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
f270: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
f280: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
f290: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f2a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
f2b0: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
f2c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f2d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
f2e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
f2f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f300: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
f310: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
f320: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
f330: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
f340: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
f350: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f360: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
f370: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
f380: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
f390: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
f3a0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f3b0: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
f3c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f3d0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
f3e0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
f3f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f400: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
f410: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
f420: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
f430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f440: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
f450: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
f460: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
f470: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
f480: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
f490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
f4a0: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
f4b0: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
f4c0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
f4d0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f4e0: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
f4f0: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
f500: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
f510: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f520: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
f530: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
f540: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
f550: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
f560: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
f570: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
f580: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
f590: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
f5a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
f5b0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f5c0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
f5d0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f5e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f5f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
f600: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
f610: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
f620: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
f630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f640: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
f650: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
f660: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
f670: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
f680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f690: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
f6a0: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
f6b0: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
f6c0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
f6d0: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
f6e0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
f6f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
f700: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f710: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
f720: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
f730: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f740: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f750: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f760: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
f770: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f780: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f790: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7a0: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
f7b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f7c0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f7d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f7e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7f0: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
f800: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
f810: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
f820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f830: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
f840: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
f850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f860: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
f870: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
f880: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
f890: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
f8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
f8b0: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
f8c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f8d0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
f8e0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
f8f0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
f900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
f910: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
f920: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f930: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f940: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f950: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
f960: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
f970: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f980: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f990: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
f9a0: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
f9b0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
f9c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f9d0: 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20   /* Versions of 
f9e0: 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
f9f0: 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61  3.5.8 set the pa
fa00: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fa10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
fa20: 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65  nal header to ze
fa30: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
fa40: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
fa50: 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  e Pager.pageSize
fa60: 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
fa70: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
fa80: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  to the correct p
fa90: 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  age size..    */
faa0: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
fab0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
fac0: 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
fad0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
fae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
faf0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
fb00: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
fb10: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
fb20: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
fb30: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
fb40: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
fb50: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
fb60: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
fb70: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
fb80: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
fb90: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fba0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
fbb0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
fbc0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
fbd0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
fbe0: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
fbf0: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
fc00: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
fc10: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
fc20: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
fc30: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
fc40: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
fc50: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
fc60: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
fc70: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
fc80: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
fc90: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
fca0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
fcb0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
fcc0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
fcd0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fce0: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
fcf0: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
fd00: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
fd10: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
fd20: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
fd30: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
fd40: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
fd50: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
fd60: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
fd70: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
fd80: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
fd90: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
fda0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
fdb0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
fdc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
fdd0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
fde0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fdf0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fe00: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
fe10: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
fe20: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
fe30: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
fe40: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
fe50: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
fe60: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
fe70: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
fe80: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
fe90: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
fea0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
feb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fec0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fed0: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
fee0: 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
fef0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ff00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ff10: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
ff20: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
ff30: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
ff40: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
ff50: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
ff60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
ff70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
ff80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
ff90: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
ffa0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
ffb0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
ffc0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
ffd0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
ffe0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
fff0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
10000 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
10010 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
10020 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
10030 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
10040 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
10050 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
10060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
10070 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
10080 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
10090 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
100a0 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
100b0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
100c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
100d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
100e0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
100f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10100 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
10110 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
10120 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
10130 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
10140 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
10150 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
10160 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
10170 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
10180 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
10190 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
101a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
101b0 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
101c0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
101d0 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
101e0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
101f0 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
10200 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
10210 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10220 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10230 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10240 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10250 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10260 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
10270 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
10290 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
102a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
102b0 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
102c0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
102d0 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
102e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
102f0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
10300 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
10310 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10320 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10330 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10340 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10350 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10360 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
10370 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
10380 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
10390 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
103a0 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
103b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
103c0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
103d0 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
103e0 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
103f0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
10400 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
10410 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10420 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10430 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10440 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10450 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10460 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10490 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
104a0 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
104b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
104c0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
104d0 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
104e0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10500 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10510 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10520 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10530 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10540 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10560 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
10570 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
10580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10590 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
105a0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
105b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
105c0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
105d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
105e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
105f0 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10600 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10610 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10620 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10630 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10650 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10660 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
10670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10680 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10690 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
106a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
106b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
106c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
106e0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
106f0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10700 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10710 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10720 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10730 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10740 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10750 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10760 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10770 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10780 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10790 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
107a0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
107b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
107c0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
107d0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
107e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
107f0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10800 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10810 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10820 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10830 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10840 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10850 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10860 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10880 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10890 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
108a0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
108b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108c0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
108d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
108e0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
108f0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10900 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10910 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10920 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10930 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10940 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10950 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10960 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10970 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10980 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10990 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
109a0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
109b0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
109c0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
109d0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
109e0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
109f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10a00 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10a10 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10a20 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10a30 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10a40 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10a50 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10a60 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
10a70 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
10a80 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10a90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10aa0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10ab0 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
10ac0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
10ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10ae0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10af0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
10b00 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
10b10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10b20 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10b30 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10b40 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
10b50 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
10b60 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
10b70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b80 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10b90 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
10ba0 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10bb0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
10bc0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
10bd0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
10be0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
10bf0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
10c00 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
10c10 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
10c20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
10c30 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
10c40 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
10c50 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
10c60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10c70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
10c80 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
10c90 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
10ca0 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
10cb0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
10cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
10cd0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
10ce0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
10cf0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
10d00 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
10d10 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10d20 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
10d30 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
10d40 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
10d50 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
10d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
10d70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10d80 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10d90 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
10da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10db0 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
10dc0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
10dd0 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
10de0 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
10df0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
10e00 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
10e10 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
10e20 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
10e30 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
10e40 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
10e50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
10e60 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
10e70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10e80 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
10eb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
10ec0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
10ed0 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
10ee0 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
10ef0 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
10f00 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
10f10 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
10f20 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
10f30 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
10f40 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
10f50 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
10f60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
10f70 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
10f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
10f90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
10fa0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10fb0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
10fc0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
10fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10fe0 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
10ff0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
11000 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11010 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11020 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11030 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11040 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11050 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
11060 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
11070 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11080 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
11090 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
110a0 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
110b0 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
110c0 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
110d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
110e0 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
110f0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
11100 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
11110 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
11120 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
11130 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
11140 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11150 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11160 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
11170 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
11180 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
11190 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
111a0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
111b0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
111c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
111d0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
111e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
111f0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
11200 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
11210 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11220 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11230 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11240 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
11250 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11260 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
11270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11280 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11290 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
112a0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
112b0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
112c0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
112d0 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
112e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
112f0 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
11300 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
11310 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11320 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11330 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11340 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
11350 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
11360 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
11370 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
11380 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
11390 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
113a0 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
113b0 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
113c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
113d0 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11410 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11420 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11430 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11440 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11450 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11460 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
11470 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
11480 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
11490 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
114a0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
114b0 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
114c0 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
114d0 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
114e0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
114f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11520 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11530 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11550 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11560 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11570 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11580 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
11590 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
115a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
115b0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
115c0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
115d0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
115e0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
115f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11600 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11610 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11620 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11630 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11640 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11650 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11660 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11670 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11680 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11690 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
116a0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
116b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
116c0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
116d0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
116e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
116f0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11700 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11710 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11720 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11730 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11740 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11750 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11760 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11770 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11780 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11790 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
117a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
117b0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
117c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
117d0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
117e0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
117f0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11800 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11810 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11820 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11830 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11840 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11850 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11860 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11870 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11880 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11890 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
118a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
118b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
118c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
118d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
118e0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
118f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11900 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11910 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11920 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11930 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11940 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
11950 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
11960 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11970 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
11980 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
11990 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
119a0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
119b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
119c0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
119d0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
119e0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
119f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
11a00 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
11a10 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11a60 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
11a70 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
11a80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
11a90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11aa0 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11ab0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11ac0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
11ad0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
11ae0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11af0 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
11b00 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
11b10 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11b20 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11b30 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11b40 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11b50 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
11b60 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
11b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11b80 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
11b90 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
11ba0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11bb0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
11bc0 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
11bd0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11be0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
11bf0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
11c00 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11c10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
11c20 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
11c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11c40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11c50 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
11c60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11c70 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11c80 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
11c90 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11ca0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11cb0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
11cc0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
11cd0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11ce0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
11cf0 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
11d00 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
11d10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11d20 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11d30 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
11d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11d50 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
11d60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11d70 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
11d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11d90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11da0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
11db0 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
11dc0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
11dd0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11de0 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
11df0 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
11e00 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
11e10 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
11e20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
11e30 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
11e40 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
11e50 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11e60 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
11e70 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
11e80 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
11e90 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
11ea0 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
11eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11ec0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
11ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11ee0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
11ef0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
11f00 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
11f10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
11f20 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
11f30 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
11f40 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
11f50 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
11f60 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
11f70 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
11f80 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
11f90 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
11fa0 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
11fb0 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
11fc0 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
11fd0 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
11fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
12000 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
12010 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
12020 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
12030 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12040 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
12050 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12060 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
12070 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
12080 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
12090 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
120a0 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
120b0 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
120c0 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
120d0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
120e0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
120f0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
12100 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
12110 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
12120 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
12130 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
12140 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
12150 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
12160 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
12170 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
12180 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
12190 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
121a0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
121b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
121c0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
121d0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
121e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
121f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12200 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12230 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12240 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12260 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12270 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
122a0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
122b0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
122c0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
122d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
122e0 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
122f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12300 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12310 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12320 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12330 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12340 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12350 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12360 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12380 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12390 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
123a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
123b0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
123c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
123d0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
123e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
123f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12400 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12410 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12420 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12430 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12440 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12450 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12460 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12470 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12480 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12490 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
124a0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
124b0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
124c0 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
124d0 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
124e0 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
124f0 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12500 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
12510 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12520 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12530 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12540 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12550 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12560 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12570 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12580 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12590 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
125a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
125b0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
125c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
125d0 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
125e0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
125f0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
12600 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
12610 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12620 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12630 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12640 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12660 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12670 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12680 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12690 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
126a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
126b0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
126c0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
126d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
126e0 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
126f0 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
12700 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12710 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
12720 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
12730 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12740 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
12750 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12760 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
12770 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
12780 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
12790 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
127a0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
127b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
127c0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
127d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
127e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
127f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
12810 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
12820 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
12830 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
12840 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
12850 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
12860 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
12870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
12880 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
12890 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
128a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
128b0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
128c0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
128d0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
128e0 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
128f0 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
12900 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
12910 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
12920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
12930 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12940 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
12950 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
12960 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
12970 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
12980 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
12990 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
129a0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
129b0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
129c0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
129d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
129e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
129f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
12a00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
12a10 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
12a20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
12a30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
12a40 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
12a50 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
12a60 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
12a70 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
12a80 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
12a90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
12aa0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
12ab0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
12ac0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
12ad0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
12ae0 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
12af0 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
12b00 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
12b10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
12b20 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
12b30 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12b40 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
12b50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12b60 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
12b70 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
12b80 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
12b90 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
12ba0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
12bb0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
12bc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12bd0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12be0 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
12bf0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
12c00 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
12c10 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
12c20 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
12c30 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
12c40 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
12c50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
12c60 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
12c70 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
12c80 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
12c90 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
12ca0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12cb0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
12cc0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
12cd0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
12ce0 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
12cf0 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
12d00 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
12d10 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
12d20 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
12d30 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
12d40 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
12d50 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
12d60 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
12d70 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
12d80 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12d90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
12da0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
12db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12dc0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
12dd0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
12de0 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
12df0 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
12e00 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e10 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e20 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
12e30 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
12e40 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
12e50 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
12e60 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
12e70 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
12e80 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
12e90 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
12ea0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12eb0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
12ec0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
12ed0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
12ee0 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
12ef0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
12f00 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
12f10 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12f20 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
12f30 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
12f40 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
12f50 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
12f60 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
12f70 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12f80 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12f90 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12fa0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12fb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12fc0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12fd0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12fe0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12ff0 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
13000 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
13010 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
13020 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13030 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
13040 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
13050 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
13060 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
13070 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
13080 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
13090 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
130a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
130b0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
130c0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
130d0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
130e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
130f0 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
13100 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
13110 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
13120 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
13130 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
13140 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
13150 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
13160 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
13170 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
13180 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13190 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
131a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
131b0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
131c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
131d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
131e0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
131f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13200 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13210 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13220 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13230 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13240 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13250 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13260 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13270 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13280 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13290 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
132a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
132b0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
132c0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
132d0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
132e0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
132f0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13300 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13310 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13330 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13340 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13350 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13360 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13370 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13380 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13390 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
133a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
133b0 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
133c0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
133d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
133e0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
133f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13400 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13420 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13430 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13440 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13450 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13460 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13470 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13480 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13490 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
134a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
134b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
134c0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
134d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
134e0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
134f0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13500 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13510 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13520 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13540 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13550 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13570 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13580 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13590 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
135a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
135b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
135c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
135d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
135e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
135f0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13600 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13610 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13620 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13630 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13640 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13650 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13660 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13670 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13680 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13690 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
136a0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
136b0 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
136c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
136d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
136e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
136f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
13710 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13720 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13730 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13740 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13750 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13760 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13770 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13780 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13790 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
137a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
137b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
137c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
137d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
137e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
137f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13810 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13820 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13830 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13840 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13850 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13860 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13870 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13880 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13890 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
138a0 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
138b0 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
138c0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
138d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
138e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
138f0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13900 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
13910 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13920 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13930 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13940 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13950 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13960 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13970 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13980 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13990 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
139a0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
139b0 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
139c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
139d0 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
139e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139f0 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
13a00 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
13a10 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
13a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13a40 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13a60 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13a70 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13a80 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13a90 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13aa0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ac0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ad0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
13ae0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13af0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13b00 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
13b10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
13b30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13b40 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13b50 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13b60 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13b80 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13b90 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13ba0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13bc0 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13bd0 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13be0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13bf0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13c00 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13c10 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13c20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13c30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13c40 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13c50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13c60 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13c70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13c80 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13c90 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13ca0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13cb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13cc0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13cd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13ce0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13cf0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13d00 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13d10 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13d20 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13d30 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13d40 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13d50 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
13d60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13d70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
13d80 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
13d90 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
13da0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
13db0 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
13dc0 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
13dd0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
13de0 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
13df0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
13e00 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
13e10 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
13e20 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13e30 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
13e40 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
13e50 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
13e60 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
13e70 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
13e80 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
13e90 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
13ea0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
13eb0 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  (!pagerUseWal(pP
13ec0 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33  ager) || sqlite3
13ed0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
13ee0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
13ef0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20  )).  ){.    rc2 
13f00 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
13f10 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
13f20 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
13f30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
13f40 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  e = 0;.  }.  pPa
13f50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
13f60 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50  GER_READER;.  pP
13f70 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
13f80 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
13f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
13fa0 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
13fb0 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
13fc0 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
13fd0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
13fe0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
13ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14010 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
14020 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14030 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  R state, do not 
14040 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
14050 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
14060 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
14070 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
14080 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
14090 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
140a0 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
140b0 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
140c0 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
140d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
140e0 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74   file and move t
140f0 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
14100 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20   OPEN state. If 
14110 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74  this .** means t
14120 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68  hat there is a h
14130 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
14140 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
14150 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a  em, the next .**
14160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f   connection to o
14170 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
14180 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
14190 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
141a0 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c  his one) .** wil
141b0 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  l roll it back..
141c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
141d0 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
141e0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
141f0 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
14200 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
14210 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
14220 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
14230 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
14240 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
14250 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
14260 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
14270 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
14280 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
14290 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
142a0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
142b0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
142c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
142d0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
142e0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
142f0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
14300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14310 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50  AGER_ERROR && pP
14320 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14330 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
14340 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14350 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14360 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  r) );.    if( pP
14370 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
14380 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
14390 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
143a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
143b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  loc();.      sql
143c0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
143d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
143e0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
143f0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  nMalloc();.    }
14400 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
14410 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14420 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14430 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
14440 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
14450 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64  .      pager_end
14460 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
14470 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
14480 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
14490 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
144a0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
144b0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
144c0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
144d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
144e0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
144f0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
14500 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
14510 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
14520 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
14530 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
14540 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
14550 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
14560 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
14570 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
14580 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
14590 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
145a0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
145b0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
145c0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
145d0 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
145e0 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
145f0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
14600 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
14610 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
14620 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14630 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
14640 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
14650 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
14660 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
14670 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
14680 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
14690 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
146a0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
146b0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
146c0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
146d0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
146e0 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
146f0 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
14700 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
14710 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
14720 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
14730 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
14740 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
14750 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
14760 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
14770 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
14780 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
14790 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
147a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
147b0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
147c0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
147d0 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
147e0 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
147f0 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
14800 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
14810 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
14820 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
14830 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
14840 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
14850 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
14860 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
14870 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
14880 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
14890 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
148a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
148b0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
148c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
148d0 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
148e0 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
148f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14900 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
14910 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
14920 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
14930 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
14940 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
14950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
14960 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
14970 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
14980 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
14990 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
149a0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
149b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
149c0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
149d0 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
149e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
149f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
14a00 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
14a10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
14a20 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
14a30 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
14a40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
14a70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
14a80 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
14a90 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
14aa0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
14ab0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
14ac0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
14ad0 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
14ae0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
14af0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
14b00 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
14b10 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
14b20 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
14b30 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14b40 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
14b50 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
14b60 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
14b70 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
14b80 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
14b90 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
14ba0 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
14bb0 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
14bc0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
14bd0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
14be0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
14bf0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
14c00 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
14c10 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
14c20 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
14c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
14c40 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
14c50 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
14c60 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
14c70 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
14c80 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14c90 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
14ca0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
14cb0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
14cc0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
14cd0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
14ce0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
14cf0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14d00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
14d10 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
14d20 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
14d30 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
14d40 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
14d50 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d60 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
14d70 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
14d80 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
14d90 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
14da0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14db0 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
14dc0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
14dd0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
14de0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
14df0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
14e00 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
14e10 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
14e20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
14e30 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
14e40 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14e50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14e60 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14e70 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14e80 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
14e90 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
14ea0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14eb0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
14ec0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
14ed0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
14ee0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
14ef0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f00 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
14f10 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
14f20 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
14f30 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14f40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f50 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
14f60 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14f70 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14f80 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
14f90 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
14fa0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
14fb0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
14fc0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
14fd0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
14fe0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
14ff0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
15000 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
15010 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
15020 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
15030 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
15040 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
15050 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
15060 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
15070 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15080 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
15090 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
150a0 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
150b0 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
150c0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
150d0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
150e0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
150f0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
15100 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15110 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
15120 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
15130 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
15140 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
15150 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
15160 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
15170 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15180 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
15190 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
151a0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
151b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
151c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
151d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
151e0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
151f0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
15200 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
15210 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15220 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
15230 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
15240 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
15250 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
15260 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
15270 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
15280 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
152a0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
152b0 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
152c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
152d0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
152e0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
152f0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
15300 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
15310 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15330 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
15340 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
15360 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
15390 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
153a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
153d0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
153e0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
153f0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15410 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
15420 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
15430 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
15440 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
15450 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15460 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
15470 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
15480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
154b0 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
154c0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
154d0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
154e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
154f0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
15500 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
15510 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
15520 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
15530 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
15540 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
15550 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
15560 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
15570 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
15580 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
15590 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
155a0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
155b0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
155c0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
155d0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
155e0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
155f0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
15600 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
15610 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
15620 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
15630 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
15640 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
15650 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
15660 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
15670 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
15680 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
15690 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
156a0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
156b0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
156c0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
156d0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
156e0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
156f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15700 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15710 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
15720 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
15730 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15740 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
15750 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
15760 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
15770 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
15780 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
15790 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
157a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
157b0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
157c0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
157d0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
157e0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
157f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
15800 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
15810 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
15820 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
15830 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
15840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15850 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15860 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
15870 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
15880 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15890 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
158a0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
158b0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
158c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
158d0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
158e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
158f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
15900 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
15910 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
15920 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
15930 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
15940 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
15950 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
15960 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
15970 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
15980 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
15990 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
159a0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
159b0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
159c0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
159d0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
159e0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
159f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
15a10 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
15a20 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
15a30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15a40 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
15a50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15a70 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
15a80 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
15a90 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
15aa0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
15ab0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
15ac0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
15ad0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
15ae0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
15af0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
15b00 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
15b10 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
15b20 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
15b30 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
15b40 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
15b50 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
15b60 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
15b70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
15b80 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
15b90 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
15ba0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
15bb0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
15bc0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
15bd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
15be0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15bf0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15c00 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
15c10 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
15c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15c30 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
15c40 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
15c50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
15c60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
15c70 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
15c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15ca0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
15cb0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
15cc0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
15cd0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
15ce0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
15cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
15d00 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
15d10 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
15d20 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
15d30 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
15d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15d50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15d60 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
15d70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
15d80 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
15d90 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
15da0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
15db0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
15dc0 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
15dd0 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
15de0 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
15df0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
15e00 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
15e10 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
15e20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
15e30 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
15e40 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
15e50 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
15e60 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
15e70 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
15e80 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
15e90 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
15ea0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
15eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
15ec0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
15ed0 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
15ee0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
15ef0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
15f00 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
15f10 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
15f20 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
15f30 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
15f40 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
15f50 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
15f60 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
15f70 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
15f80 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
15f90 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
15fa0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
15fb0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
15fc0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
15fd0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
15fe0 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
15ff0 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
16000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16010 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
16020 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
16030 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
16040 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
16050 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16060 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16070 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
16080 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
16090 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
160a0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
160b0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
160c0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
160d0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
160e0 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
160f0 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16100 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16110 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16120 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16130 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16140 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16150 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16160 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16170 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
16180 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
16190 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
161a0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
161b0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
161c0 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
161d0 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
161e0 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
161f0 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16200 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16210 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16220 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16230 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16240 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16250 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16260 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16270 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16280 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16290 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
162a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
162b0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
162c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
162d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
162e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
162f0 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16300 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16310 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16320 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16330 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16340 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16350 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16360 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16370 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16380 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16390 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
163a0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
163b0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
163c0 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
163d0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
163e0 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
163f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16400 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16410 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16420 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16430 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16440 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16450 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16460 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16470 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16480 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16490 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
164a0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
164b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
164c0 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
164d0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
164e0 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
164f0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16500 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16510 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16520 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16530 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16540 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16560 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16570 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16580 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16590 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
165a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
165b0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
165c0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
165d0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
165e0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
165f0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16600 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16610 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16620 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16630 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16640 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16650 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
16660 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
16670 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
16680 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
16690 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
166a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
166b0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
166c0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
166d0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
166e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
166f0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
16700 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
16710 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
16720 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
16730 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
16740 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
16750 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
16760 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16770 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
16780 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
16790 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
167a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
167b0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
167c0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
167d0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
167e0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
167f0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
16800 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
16810 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
16820 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
16830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
16840 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
16850 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
16860 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
16870 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
16880 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
16890 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
168a0 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
168b0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
168c0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
168d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
168f0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
16900 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
16910 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
16920 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
16930 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16940 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
16950 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16960 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
16970 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16980 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
16990 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
169a0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
169b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
169c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
169d0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
169e0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
169f0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
16a00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
16a10 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
16a20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
16a30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
16a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
16a50 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
16a60 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16a70 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
16a80 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
16a90 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
16aa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
16ab0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16ac0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
16ad0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
16ae0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
16af0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
16b00 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
16b10 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
16b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
16b30 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
16b40 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
16b50 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
16b60 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
16b70 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
16b80 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
16b90 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
16ba0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
16bb0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
16bc0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
16bd0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
16be0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
16bf0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
16c00 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
16c10 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
16c20 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
16c30 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
16c40 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
16c50 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
16c60 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
16c70 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
16c80 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
16c90 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
16ca0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
16cb0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16cc0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
16cd0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
16ce0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
16cf0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
16d00 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
16d10 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
16d20 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
16d30 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
16d40 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
16d50 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
16d60 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
16d70 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
16d80 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
16d90 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
16da0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
16db0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
16dc0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
16dd0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
16de0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
16df0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
16e00 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16e10 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
16e20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
16e30 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
16e40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
16e50 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
16e60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
16e70 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
16e80 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
16e90 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
16ea0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
16eb0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
16ec0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
16ed0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
16ee0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
16ef0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
16f00 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
16f10 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
16f20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
16f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
16f40 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16f60 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
16f70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
16f80 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
16f90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fa0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
16fb0 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
16fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16fd0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
16fe0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
16ff0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
17000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17010 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17020 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17030 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17040 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17050 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17060 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17070 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17080 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17090 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
170a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
170b0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
170c0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
170d0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
170e0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
170f0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17100 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17110 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17120 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17130 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17140 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17150 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17160 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17170 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17180 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17190 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
171a0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
171b0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
171c0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
171d0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
171e0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
171f0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17200 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17210 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17220 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17230 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17240 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17250 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17270 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17280 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17290 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
172a0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
172b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
172c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
172d0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
172e0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
172f0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17300 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17310 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17320 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17330 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17340 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17350 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17360 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17370 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17380 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17390 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
173a0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
173b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
173c0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
173d0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
173e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
173f0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17400 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17410 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17420 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17430 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17440 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17450 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17460 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17470 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17480 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17490 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
174a0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
174b0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
174c0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
174d0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
174e0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
174f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17500 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17510 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17520 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17540 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17550 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17560 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17570 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17580 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17590 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
175a0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
175b0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
175c0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
175d0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
175e0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
175f0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17600 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17610 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17620 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
17630 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
17640 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
17650 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
17660 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
17670 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17680 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
17690 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
176a0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
176b0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
176c0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
176d0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
176e0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
176f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17700 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17710 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
17730 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
17740 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
17750 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
17760 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
17770 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
17780 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
17790 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
177a0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
177b0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
177c0 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
177d0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
177e0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
177f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
17800 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
17810 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
17820 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17830 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
17840 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
17850 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
17860 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
17870 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
17880 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
17890 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
178a0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
178b0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
178c0 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
178d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
178e0 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
178f0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
17900 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
17910 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
17920 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
17930 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
17940 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
17950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
17960 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
17970 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
17980 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17990 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
179a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
179b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
179c0 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
179d0 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
179e0 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
179f0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
17a00 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
17a10 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
17a20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
17a30 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
17a40 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
17a50 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
17a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17a70 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
17a80 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
17a90 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
17aa0 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
17ab0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
17ac0 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
17ad0 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
17ae0 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
17af0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
17b00 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
17b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
17b20 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
17b30 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
17b40 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
17b50 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
17b60 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
17b70 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
17b80 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
17b90 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
17ba0 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
17bb0 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
17bc0 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
17bd0 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
17be0 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
17bf0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
17c00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17c10 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
17c20 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
17c30 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
17c40 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
17c50 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
17c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17c70 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
17c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17c90 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
17ca0 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
17cb0 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
17cc0 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
17ce0 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
17cf0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
17d00 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
17d10 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
17d20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
17d30 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
17d40 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
17d50 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
17d60 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
17d70 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
17d80 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
17d90 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
17da0 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
17db0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
17dc0 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
17dd0 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
17de0 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
17df0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
17e00 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
17e10 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
17e20 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
17e30 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
17e40 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
17e50 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
17e60 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
17e70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
17e80 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
17e90 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
17ea0 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
17eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
17ec0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17ed0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
17ee0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
17ef0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
17f00 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
17f10 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
17f20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
17f30 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
17f40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
17f50 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
17f60 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
17f70 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
17f80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17f90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
17fa0 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
17fb0 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
17fc0 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
17fd0 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
17fe0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17ff0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
18000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
18010 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
18020 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18030 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18040 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18050 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18060 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18070 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18080 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18090 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
180a0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
180b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
180c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
180d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
180e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
180f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18110 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18120 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18130 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18140 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18150 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18160 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18170 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18180 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18190 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
181a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
181b0 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
181c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
181d0 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
181e0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
181f0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18210 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18220 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18230 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18240 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18250 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18260 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18270 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18280 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18290 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
182a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
182b0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
182c0 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
182d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
182e0 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
182f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18300 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18310 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18320 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18330 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18340 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18350 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18370 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18380 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18390 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
183a0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
183b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
183c0 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
183d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
183e0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
183f0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18400 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18410 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18430 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18440 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
18450 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18460 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18470 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
18480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18490 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
184a0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
184b0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
184c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
184d0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
184e0 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
184f0 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18500 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18510 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18520 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18530 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18540 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18550 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18560 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18570 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
18580 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
18590 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
185a0 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
185b0 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
185c0 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
185d0 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
185e0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
185f0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18600 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18610 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18620 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
18630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18640 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18650 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
18660 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
18670 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
18680 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
18690 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
186a0 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
186b0 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
186c0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
186d0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
186e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
186f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18700 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
18710 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
18720 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
18730 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
18740 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
18750 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
18760 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
18780 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18790 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
187a0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
187b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
187c0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
187d0 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
187e0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
187f0 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
18800 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
18810 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
18820 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
18830 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
18840 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
18850 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
18860 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
18870 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
18880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
188a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
188b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
188c0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
188d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
188e0 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
188f0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
18900 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
18910 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
18920 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
18930 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
18940 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
18950 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
18960 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
18970 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
18980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
18990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
189a0 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
189b0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
189c0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
189d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
189e0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
189f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
18a00 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
18a10 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
18a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18a50 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18a60 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
18a70 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
18a80 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
18a90 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
18aa0 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
18ab0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
18ac0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
18ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18ae0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18af0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
18b10 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
18b20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
18b30 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
18b40 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
18b50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
18b60 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
18b70 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
18b80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18b90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
18ba0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18bb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
18bc0 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
18bd0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
18be0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
18bf0 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
18c00 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
18c10 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18c20 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
18c30 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
18c40 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
18c50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
18c60 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
18c70 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
18c80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18c90 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
18ca0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
18cb0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
18cc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
18cd0 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
18ce0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
18cf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18d00 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
18d10 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
18d20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18d30 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
18d40 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
18d50 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
18d60 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
18d70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
18d80 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
18d90 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
18da0 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
18db0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
18dc0 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
18dd0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
18de0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
18df0 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
18e00 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
18e10 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
18e20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
18e30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
18e40 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
18e50 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
18e60 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
18e70 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
18e80 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
18e90 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
18ea0 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
18eb0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
18ec0 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
18ed0 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
18ee0 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
18ef0 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
18f00 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
18f10 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
18f20 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68  r, it might migh
18f30 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
18f40 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  at the file on d
18f50 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  isk is smaller t
18f60 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61  han .** nPage pa
18f70 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74  ges. Some operat
18f80 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
18f90 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
18fa0 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a  et confused if .
18fb0 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72  ** you try to tr
18fc0 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
18fd0 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
18fe0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
18ff0 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  t .** currently 
19000 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68  is, so detect th
19010 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
19020 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
19030 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20  byte to .** the 
19040 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66  end of the new f
19050 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ile instead..**.
19060 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19070 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19080 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  OK. If an IO err
19090 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
190a0 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65  modifying.** the
190b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
190c0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
190d0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
190e0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
190f0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
19100 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19110 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
19120 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19130 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
19140 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19150 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
19160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19170 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41  State!=PAGER_REA
19180 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20  DER );.  .  if( 
19190 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
191a0 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  d) .   && (pPage
191b0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
191c0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
191d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
191e0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20  =PAGER_OPEN) .  
191f0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
19200 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
19210 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
19220 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19230 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19240 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
19250 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
19260 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
19270 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
19280 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
19290 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
192a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
192b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
192c0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
192d0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a      newSize = sz
192e0 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Page*(i64)nPage;
192f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19300 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
19310 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
19320 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
19330 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
19340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19350 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
19360 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
19370 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
19380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
19390 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
193a0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
193b0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
193c0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
193d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
193e0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
193f0 20 3c 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   <  currentSize 
19400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19410 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19420 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
19430 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19440 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19450 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
19460 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19480 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19490 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
194a0 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
194b0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
194c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
194d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
194e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
194f0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
19500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
19510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19520 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
19530 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
19540 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
19550 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
19560 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
19570 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
19580 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19590 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
195a0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
195b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
195c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
195d0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
195e0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
195f0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19600 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19610 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19630 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
19640 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
19650 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
19660 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19670 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19680 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19690 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
196a0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
196b0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
196c0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
196d0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
196e0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
196f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19700 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
19710 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
19720 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
19730 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
19740 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
19750 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
19760 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
19770 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
19780 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
19790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
197a0 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
197b0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
197c0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
197d0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
197e0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
197f0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
19800 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
19810 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
19820 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
19830 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
19840 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
19850 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
19860 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
19870 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
19880 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
19890 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
198a0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
198b0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
198c0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
198d0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
198e0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
198f0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
19900 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
19910 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
19920 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
19930 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
19940 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
19950 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
19960 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
19970 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
19980 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
19990 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
199a0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
199b0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
199c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
199d0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
199e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
199f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19a00 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19a10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
19a20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19a30 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
19a40 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
19a50 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19a60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19a80 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19a90 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
19aa0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
19ab0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
19ac0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
19ad0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
19ae0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
19af0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
19b00 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
19b10 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
19b20 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
19b30 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
19b40 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
19b50 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19b60 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
19b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
19b80 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19b90 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19ba0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
19bb0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
19bc0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32  r->sectorSize<32
19bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19be0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
19bf0 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  12;.    }.    if
19c00 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19c10 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
19c20 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 61 73  SIZE ){.      as
19c30 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19c40 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19c50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19c60 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43  orSize = MAX_SEC
19c70 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
19c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
19c90 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
19ca0 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
19cb0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
19cc0 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
19cd0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
19ce0 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
19cf0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
19d00 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
19d10 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
19d20 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
19d30 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
19d40 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
19d50 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
19d60 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
19d70 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
19d80 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19d90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19da0 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
19db0 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
19dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19dd0 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
19de0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
19df0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
19e00 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
19e10 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
19e20 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
19e30 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
19e40 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19e50 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19e60 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
19e70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
19e80 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
19e90 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
19ea0 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
19eb0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
19ec0 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
19ed0 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
19ee0 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
19ef0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
19f00 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
19f10 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19f20 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19f30 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
19f40 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
19f50 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
19f60 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
19f70 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
19f80 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19f90 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19fa0 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
19fb0 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
19fc0 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
19fd0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
19fe0 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
19ff0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1a000 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1a010 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1a020 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1a030 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1a040 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1a050 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1a060 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1a070 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1a080 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1a090 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1a0a0 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1a0b0 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1a0c0 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1a0d0 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1a0e0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1a0f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1a100 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1a110 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1a120 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1a130 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1a140 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1a150 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1a160 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1a170 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1a180 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1a190 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1a1a0 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1a1b0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1a1c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a1d0 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1a1e0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1a1f0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1a200 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1a210 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1a220 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1a230 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1a240 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a250 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1a260 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1a270 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1a280 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1a290 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1a2a0 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1a2b0 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1a2c0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1a2d0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1a2e0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1a2f0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1a300 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1a310 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1a320 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1a330 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1a340 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1a350 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1a360 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1a370 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1a380 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1a390 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1a3a0 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1a3b0 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1a3c0 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1a3d0 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1a3e0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1a3f0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1a400 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1a410 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1a420 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1a430 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1a440 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1a450 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1a460 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1a470 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1a480 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1a490 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1a4a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1a4b0 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1a4c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a4d0 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1a4e0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1a4f0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1a500 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1a510 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1a520 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1a530 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1a540 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1a550 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1a560 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1a570 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1a580 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1a590 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1a5a0 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1a5b0 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1a5c0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1a5d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1a5e0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1a5f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1a600 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1a610 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1a620 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1a630 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1a640 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1a650 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1a660 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1a670 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1a680 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1a690 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1a6a0 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1a6b0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1a6c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1a6d0 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1a6e0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1a6f0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1a700 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1a710 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1a720 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1a730 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1a740 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1a750 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1a760 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1a770 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1a780 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1a790 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1a7a0 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1a7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a7c0 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1a7d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1a7e0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1a7f0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1a800 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1a810 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1a820 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a840 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1a850 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1a860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a870 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1a880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1a890 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1a8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1a8b0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1a8c0 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1a8d0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1a8e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a8f0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1a900 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1a910 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1a920 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a930 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1a940 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1a950 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1a960 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a970 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1a980 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1a990 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1a9a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1a9b0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1a9c0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1a9d0 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1a9e0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1a9f0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1aa00 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1aa10 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1aa20 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1aa30 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1aa40 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1aa50 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1aa60 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1aa70 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1aa80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1aa90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1aaa0 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1aab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1aac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1aad0 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1aae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aaf0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ab00 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1ab10 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1ab20 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1ab30 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1ab40 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1ab50 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1ab60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1ab70 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1ab80 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1ab90 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1aba0 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1abb0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1abc0 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1abd0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1abe0 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1abf0 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1ac00 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1ac10 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1ac20 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1ac30 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1ac40 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1ac50 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1ac60 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1ac70 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1ac80 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1ac90 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1aca0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1acb0 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1acc0 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1acd0 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1ace0 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1acf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1ad00 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1ad10 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1ad20 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1ad30 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1ad40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1ad50 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1ad60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1ad70 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1ad80 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ad90 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1ada0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1adb0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1adc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1add0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1ade0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1adf0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1ae00 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1ae10 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1ae20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1ae30 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1ae40 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ae50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1ae60 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1ae70 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1ae80 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1ae90 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1aea0 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1aeb0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1aec0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1aed0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1aee0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1aef0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1af00 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1af10 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1af20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1af30 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1af40 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1af50 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1af60 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1af70 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1af80 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1af90 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1afa0 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1afb0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1afc0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1afd0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1afe0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1aff0 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1b000 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1b010 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1b020 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1b030 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1b040 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1b050 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1b060 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1b070 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1b080 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1b090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b0a0 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1b0b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b0c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b0d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1b0e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b0f0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1b100 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1b110 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b120 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1b130 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1b140 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1b150 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1b160 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1b170 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1b180 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b190 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1b1a0 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1b1b0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1b1c0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b1d0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1b1e0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1b1f0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1b200 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1b210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1b220 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1b230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b250 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1b260 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1b270 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1b280 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1b290 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1b2a0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b2b0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b2c0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b2d0 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1b2e0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1b2f0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1b300 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1b310 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1b320 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1b330 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1b340 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1b350 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1b360 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1b370 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1b380 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1b390 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1b3a0 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1b3b0 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1b3c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b3d0 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1b3e0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1b3f0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1b400 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1b410 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1b420 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1b430 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1b440 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1b450 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1b460 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1b470 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1b480 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1b490 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1b4a0 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1b4b0 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1b4c0 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1b4d0 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1b4e0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1b4f0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1b500 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1b510 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1b520 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1b530 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1b540 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1b550 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1b560 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1b570 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1b580 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1b590 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1b5a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b5b0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1b5c0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1b5d0 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1b5e0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1b5f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b600 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1b610 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1b620 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1b630 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b640 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1b650 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1b660 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1b670 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1b680 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1b690 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1b6a0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1b6b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b6c0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1b6d0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1b6e0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1b6f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1b700 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1b710 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1b720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b740 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1b750 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1b760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b770 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1b780 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1b790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b7a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b7b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1b7d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1b7e0 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1b7f0 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1b800 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1b810 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1b820 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1b830 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b840 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1b850 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1b860 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1b870 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1b880 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1b890 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b8a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b8b0 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1b8c0 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1b8d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1b8e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b8f0 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1b900 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1b910 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1b920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b930 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
1b940 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1b960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1b970 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1b980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b990 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1b9a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1b9b0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1b9c0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1b9d0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1b9e0 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1b9f0 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1ba00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ba10 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1ba20 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1ba30 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1ba40 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1ba50 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1ba60 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1ba70 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1ba80 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1ba90 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1baa0 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1bab0 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1bac0 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1bad0 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1bae0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1baf0 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1bb00 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1bb10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1bb20 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1bb30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bb40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bb50 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1bb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb70 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1bb80 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1bb90 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1bba0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1bbb0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1bbc0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1bbd0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1bbe0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1bbf0 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1bc00 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1bc10 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1bc20 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1bc30 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1bc40 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1bc50 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1bc60 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1bc70 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1bc80 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1bc90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1bca0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bcb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bcc0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1bcd0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1bce0 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1bcf0 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1bd00 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1bd10 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1bd20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1bd30 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1bd40 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1bd50 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1bd60 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1bd70 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1bd80 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1bd90 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1bda0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1bdb0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1bdc0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1bdd0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1bde0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1bdf0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1be00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 65    */.  sqlite3Be
1be10 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1be20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
1be30 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1be40 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20  thods==0 ||.    
1be50 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1be60 74 72 6f 6c 4e 6f 46 61 69 6c 28 70 50 61 67 65  trolNoFail(pPage
1be70 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1be80 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1be90 30 29 3e 3d 30 0a 20 20 29 3b 0a 20 20 73 71 6c  0)>=0.  );.  sql
1bea0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1beb0 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  loc();..  /* If 
1bec0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1bed0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1bee0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1bef0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1bf00 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1bf10 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1bf20 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1bf30 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1bf40 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1bf50 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1bf60 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1bf70 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1bf80 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1bf90 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1bfa0 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1bfb0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1bfc0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1bfd0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1bfe0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1bff0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1c000 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1c010 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1c020 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1c030 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1c040 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1c050 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1c060 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1c070 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1c080 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1c090 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1c0a0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1c0b0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1c0c0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1c0d0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1c0e0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1c0f0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1c100 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1c110 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1c120 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1c130 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1c140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c150 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1c160 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1c170 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1c180 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1c190 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1c1a0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1c1b0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1c1c0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1c1d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1c1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c1f0 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1c200 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1c210 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1c220 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1c230 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1c240 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c250 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1c260 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1c270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c280 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1c290 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1c2a0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1c2b0 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73  !='\0');.    tes
1c2c0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1c2d0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1c2e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c2f0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1c300 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1c310 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1c320 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1c330 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1c340 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1c350 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1c360 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1c370 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1c380 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1c390 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1c3a0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1c3b0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1c3c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1c3d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1c3e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1c3f0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1c400 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1c410 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1c420 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1c430 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1c440 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1c450 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1c460 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1c470 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1c480 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1c490 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1c4a0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1c4b0 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1c4c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1c4d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1c4e0 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1c4f0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1c500 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1c510 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1c520 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1c530 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1c540 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1c550 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1c560 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1c570 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1c580 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1c590 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1c5a0 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1c5b0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1c5c0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1c5d0 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1c5e0 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1c5f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c600 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1c610 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1c620 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1c630 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1c640 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1c650 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1c660 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1c670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c680 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1c690 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1c6a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c6b0 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
1c6c0 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1c6d0 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
1c6e0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
1c6f0 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
1c700 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1c710 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1c720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c740 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1c750 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20  t isInWal = 0;  
1c760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c770 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e  ue if page is in
1c780 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69   log file */.  i
1c790 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1c7a0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1c7b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c7c0 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1c7d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1c7e0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1c7f0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1c800 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1c810 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1c820 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f    if( NEVER(!isO
1c830 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
1c840 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c850 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1c860 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
1c870 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
1c880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c890 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c8a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1c8b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1c8c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
1c8d0 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1c8e0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1c8f0 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1c900 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1c910 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72  e3WalRead(pPager
1c920 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
1c930 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50  sInWal, pgsz, pP
1c940 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20  g->pData);.  }. 
1c950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c960 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29  OK && !isInWal )
1c970 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1c980 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1c990 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1c9a0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1c9b0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1c9c0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1c9d0 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1c9e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c9f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1ca00 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1ca10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ca20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1ca30 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1ca40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1ca50 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1ca60 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1ca70 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1ca80 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1ca90 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1caa0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1cab0 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1cac0 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1cad0 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1cae0 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1caf0 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1cb00 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1cb10 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1cb20 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1cb30 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1cb40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1cb50 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1cb60 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1cb70 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1cb80 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1cb90 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1cba0 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1cbb0 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1cbc0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1cbd0 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1cbe0 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1cbf0 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1cc00 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1cc10 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1cc20 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1cc30 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1cc40 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1cc50 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1cc60 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1cc70 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1cc80 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1cc90 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1cca0 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75  hite noising equ
1ccb0 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f  aling 16 bytes o
1ccc0 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68  f 0xff is vanish
1ccd0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20  ingly small so. 
1cce0 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
1ccf0 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20  d still be ok.. 
1cd00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65       */.      me
1cd10 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46  mset(pPager->dbF
1cd20 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73  ileVers, 0xff, s
1cd30 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1cd40 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1cd50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
1cd60 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
1cd70 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
1cd80 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [24];.      memc
1cd90 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1cda0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1cdb0 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
1cdc0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1cdd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44  .    }.  }.  COD
1cde0 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
1cdf0 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
1ce00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ce10 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  EM);..  PAGER_IN
1ce20 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1ce30 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1ce40 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1ce50 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1ce60 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1ce70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1ce80 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1ce90 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1cea0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1ceb0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1cec0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1ced0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1cee0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1cef0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1cf00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  ;.}../*.** Updat
1cf10 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1cf20 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cf30 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20  r at offsets 24 
1cf40 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65  and 92 in.** the
1cf50 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
1cf60 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  sqlite version n
1cf70 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
1cf80 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  96..**.** This i
1cf90 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  s an uncondition
1cfa0 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20  al update.  See 
1cfb0 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69  also the pager_i
1cfc0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1cfd0 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  r().** routine w
1cfe0 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65  hich only update
1cff0 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
1d000 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61  nter if the upda
1d010 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a  te is actually.*
1d020 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74  * needed, as det
1d030 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
1d040 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1d050 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72  ntDone state var
1d060 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1d070 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74   void pager_writ
1d080 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1d090 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75  PgHdr *pPg){.  u
1d0a0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1d0b0 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  r;..  /* Increme
1d0c0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1d0d0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1d0e0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1d0f0 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1d100 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
1d110 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
1d120 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46  pPg->pPager->dbF
1d130 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75  ileVers)+1;.  pu
1d140 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d150 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  pPg->pData)+24, 
1d160 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1d170 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72  ..  /* Also stor
1d180 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
1d190 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
1d1a0 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20  ytes 96..99 and 
1d1b0 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32  in.  ** bytes 92
1d1c0 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63  ..95 store the c
1d1d0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f  hange counter fo
1d1e0 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73  r which the vers
1d1f0 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ion number.  ** 
1d200 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70  is valid. */.  p
1d210 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1d220 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c  )pPg->pData)+92,
1d230 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1d240 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1d250 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d260 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52  )+96, SQLITE_VER
1d270 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a  SION_NUMBER);.}.
1d280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d290 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
1d2a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d2b0 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
1d2c0 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20   each page that 
1d2d0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d2e0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
1d2f0 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
1d300 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61  hen a WAL transa
1d310 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1d320 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74  back..** Paramet
1d330 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61  er iPg is the pa
1d340 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69  ge number of sai
1d350 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78  d page. The pCtx
1d360 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73   argument .** is
1d370 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
1d380 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
1d390 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
1d3a0 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73  * If page iPg is
1d3b0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1d3c0 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e  cache, and has n
1d3d0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1d3e0 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20  ferences,.** it 
1d3f0 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74  is discarded. Ot
1d400 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1d410 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
1d420 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  e outstanding.**
1d430 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65   references, the
1d440 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1d450 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74   reloaded from t
1d460 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1d470 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74  the.** attempt t
1d480 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74  o reload content
1d490 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d4a0 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61  se is required a
1d4b0 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65  nd fails, .** re
1d4c0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1d4d0 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
1d4e0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
1d4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d500 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1d510 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e  (void *pCtx, Pgn
1d520 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  o iPg){.  int rc
1d530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d540 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1d550 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20  (Pager *)pCtx;. 
1d560 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1d570 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
1d580 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
1d590 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
1d5a0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1d5b0 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
1d5c0 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
1d5d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1d5e0 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
1d5f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d600 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1d610 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1d620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d630 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1d640 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1d650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d660 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d670 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1d680 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1d690 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1d6a0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1d6b0 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1d6c0 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1d6d0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1d6e0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1d6f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1d700 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1d710 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1d720 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1d730 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1d740 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1d750 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1d760 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1d770 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1d780 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1d790 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1d7a0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1d7b0 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1d7c0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1d7d0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1d7e0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1d7f0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1d800 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1d810 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1d820 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1d830 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1d840 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1d850 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1d860 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1d870 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1d880 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1d890 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1d8a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d8b0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1d8c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1d8d0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1d8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d8f0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1d900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d910 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d930 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1d940 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1d950 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1d960 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1d970 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1d980 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1d990 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1d9a0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1d9b0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1d9c0 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1d9d0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1d9e0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1d9f0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1da00 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1da10 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1da20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1da30 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1da40 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1da50 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1da60 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1da70 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1da80 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1da90 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1daa0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1dab0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1dac0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1dad0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1dae0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1daf0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1db00 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1db10 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1db20 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1db30 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1db40 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1db50 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1db60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1db70 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1db80 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1db90 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1dba0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1dbb0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1dbc0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1dbd0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1dbe0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1dbf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1dc00 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1dc10 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1dc20 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1dc30 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1dc40 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1dc50 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1dc60 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1dc70 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1dc80 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1dc90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1dca0 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1dcb0 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1dcc0 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1dcd0 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1dce0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1dcf0 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1dd00 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1dd10 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1dd20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1dd30 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1dd40 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1dd50 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1dd60 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1dd70 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1dd80 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1dd90 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1dda0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1ddb0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1ddc0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1ddd0 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1dde0 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1ddf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1de00 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1de10 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1de20 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1de30 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1de40 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1de50 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1de60 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1de90 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1dea0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ded0 64 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  de */.#if define
1dee0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1def0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1df00 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a 20  E_CHECK_PAGES). 
1df10 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1df40 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23 65  over pages */.#e
1df50 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1df60 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1df70 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1df80 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1df90 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1dfa0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1dfb0 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1dfc0 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1dfd0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1dfe0 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1dff0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e000 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1e010 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1e020 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1e030 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20  .  if( isCommit 
1e040 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57  ){.    /* If a W
1e050 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e060 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
1e070 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  d, there is no p
1e080 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a  oint in writing.
1e090 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73      ** any pages
1e0a0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1e0b0 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rs greater than 
1e0c0 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74  nTruncate into t
1e0d0 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20  he WAL file..   
1e0e0 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65   ** They will ne
1e0f0 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61  ver be read by a
1e100 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65  ny client. So re
1e110 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
1e120 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a  he pDirty.    **
1e130 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20   list here. */. 
1e140 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1e150 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1e160 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 66 6f  = &pList;.    fo
1e170 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1e180 65 78 74 20 3d 20 70 29 3b 20 70 3d 70 2d 3e 70  ext = p); p=p->p
1e190 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66  Dirty){.      if
1e1a0 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e  ( p->pgno<=nTrun
1e1b0 63 61 74 65 20 29 20 70 70 4e 65 78 74 20 3d 20  cate ) ppNext = 
1e1c0 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1e1d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1e1e0 69 73 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ist );.  }..  if
1e1f0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
1e200 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
1e210 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
1e220 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1e230 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1e240 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1e250 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1e260 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1e270 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1e280 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
1e290 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1e2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e2b0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1e2c0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1e2d0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1e2e0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1e2f0 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1e300 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1e310 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1e320 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1e330 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1e340 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1e350 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1e360 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1e370 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1e380 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1e390 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1e3a0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1e3b0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1e3c0 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1e3d0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1e3e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1e3f0 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1e400 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1e410 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1e420 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1e430 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1e440 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1e450 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1e460 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1e470 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1e480 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1e490 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1e4a0 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1e4b0 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1e4c0 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1e4d0 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1e4e0 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1e4f0 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1e500 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1e510 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1e520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e530 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1e540 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1e550 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e560 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e580 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e590 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1e5c0 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1e5d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1e5e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1e5f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e600 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e610 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1e620 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e630 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1e640 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1e650 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1e660 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1e670 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1e680 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1e690 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1e6a0 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1e6b0 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1e6c0 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1e6d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1e6e0 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1e6f0 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1e700 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1e710 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1e720 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1e730 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1e740 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1e750 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1e760 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1e770 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1e780 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1e790 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1e7a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1e7b0 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1e7c0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1e7d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
1e7e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e7f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1e800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e810 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
1e820 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
1e830 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e   from PAGER_OPEN
1e840 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41  .** to PAGER_REA
1e850 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74  DER state to det
1e860 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1e870 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e880 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  file.** in pages
1e890 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70   (assuming the p
1e8a0 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74  age size current
1e8b0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  ly stored in Pag
1e8c0 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a  er.pageSize)..**
1e8d0 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
1e8e0 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
1e8f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1e900 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
1e910 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
1e920 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64   pages is stored
1e930 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68   in *pnPage. Oth
1e940 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72  erwise, an error
1e950 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a   code (perhaps.*
1e960 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  * SQLITE_IOERR_F
1e970 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65  STAT) is returne
1e980 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  d and *pnPage is
1e990 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
1e9a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e9b0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  pagerPagecount(P
1e9c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1e9d0 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50  no *pnPage){.  P
1e9e0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea00 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1ea10 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
1ea20 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65  ..  /* Query the
1ea30 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1ea40 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1ea50 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62   size. The WalDb
1ea60 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63  size().  ** func
1ea70 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72  tion returns zer
1ea80 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20  o if the WAL is 
1ea90 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50  not open (i.e. P
1eaa0 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f  ager.pWal==0), o
1eab0 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61  r.  ** if the da
1eac0 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1ead0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ot available. Th
1eae0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1eaf0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69  is not.  ** avai
1eb00 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1eb10 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66  AL sub-system if
1eb20 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73   the log file is
1eb30 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63   empty or.  ** c
1eb40 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64  ontains no valid
1eb50 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73   committed trans
1eb60 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  actions..  */.  
1eb70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1eb80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1eb90 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1eba0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1ebb0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50  HARED_LOCK || pP
1ebc0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
1ebd0 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1ebe0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1ebf0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1ec00 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1ec10 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74  ase size was not
1ec20 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1ec30 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1ec40 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69  em,.  ** determi
1ec50 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74  ne it based on t
1ec60 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1ec70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1ec80 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f   the size.  ** o
1ec90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1eca0 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ile is not an in
1ecb0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
1ecc0 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
1ecd0 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e  .  ** round down
1ece0 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20   to the nearest 
1ecf0 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e  page. Except, an
1ed00 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68  y file larger th
1ed10 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20  an 0.  ** bytes 
1ed20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69  in size is consi
1ed30 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dered to contain
1ed40 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
1ed50 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
1ed60 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Page==0 ){.    i
1ed70 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed90 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  Size of db file 
1eda0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1edb0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1edc0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1edd0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1ede0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
1edf0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1ee00 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
1ee10 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1ee20 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
1ee30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ee40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ee60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ee70 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
1ee80 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  (n / pPager->pag
1ee90 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
1eea0 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30 20  nPage==0 && n>0 
1eeb0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1eec0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
1eed0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1eee0 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1eef0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1ef00 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1ef10 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1ef20 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1ef30 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1ef40 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1ef50 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1ef60 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1ef70 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1ef80 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1ef90 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1efa0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1efb0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1efc0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1efd0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1efe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1eff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f000 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1f010 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1f020 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1f030 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1f040 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1f050 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1f060 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f070 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1f080 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1f090 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1f0a0 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1f0b0 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1f0c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f0d0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1f0e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f0f0 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1f100 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f110 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1f120 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1f130 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1f140 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1f150 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1f160 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1f170 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1f180 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1f190 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1f1a0 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1f1b0 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1f1c0 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1f1d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1f1e0 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1f1f0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1f200 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1f210 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1f220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f230 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1f240 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1f250 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1f260 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1f270 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1f280 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1f290 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1f2a0 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1f2b0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1f2c0 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
1f2d0 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
1f2e0 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
1f2f0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
1f300 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
1f310 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
1f320 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
1f330 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1f340 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
1f350 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
1f360 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f390 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1f3a0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1f3b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1f3c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1f3d0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
1f3e0 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  k );..  if( !pPa
1f3f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1f400 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
1f430 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
1f440 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1f470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f480 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
1f490 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1f4a0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1f4b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f4c0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1f4d0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1f4e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1f4f0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1f500 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1f510 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  0);.      isWal 
1f520 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f530 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f540 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1f550 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1f560 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1f570 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1f580 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
1f590 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1f5a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f5b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1f5c0 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
1f5d0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1f5e0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
1f5f0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1f600 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
1f610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f620 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
1f630 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
1f640 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1f650 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1f660 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1f670 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
1f680 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f690 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
1f6a0 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
1f6b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1f6c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f6d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
1f6e0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
1f6f0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
1f700 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
1f710 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
1f720 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
1f730 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f740 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
1f750 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
1f760 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
1f770 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
1f780 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
1f790 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
1f7a0 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
1f7b0 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
1f7c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
1f7d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
1f7e0 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
1f7f0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
1f800 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
1f810 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
1f820 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
1f830 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
1f840 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
1f850 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
1f860 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
1f870 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
1f880 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
1f890 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1f8a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1f8b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
1f8c0 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
1f8d0 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1f8e0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
1f8f0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
1f900 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1f910 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
1f920 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1f930 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
1f940 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
1f950 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f960 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
1f970 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
1f980 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f990 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
1f9a0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
1f9b0 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
1f9c0 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
1f9d0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1f9e0 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
1f9f0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
1fa00 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
1fa10 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1fa20 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1fa30 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1fa40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
1fa50 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
1fa60 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1fa70 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1fa80 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
1fa90 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
1faa0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
1fab0 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
1fac0 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
1fad0 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
1fae0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
1faf0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
1fb00 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
1fb10 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
1fb20 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
1fb30 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
1fb40 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
1fb50 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
1fb60 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
1fb70 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
1fb80 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1fb90 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
1fba0 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
1fbb0 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
1fbc0 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
1fbd0 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
1fbe0 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
1fbf0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
1fc00 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1fc10 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
1fc20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
1fc30 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
1fc40 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
1fc50 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
1fc60 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
1fc70 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
1fc80 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
1fc90 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
1fca0 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
1fcb0 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
1fcc0 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
1fcd0 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
1fce0 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
1fcf0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
1fd00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1fd10 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1fd20 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
1fd30 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
1fd40 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
1fd50 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
1fd60 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
1fd70 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
1fd80 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
1fd90 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
1fda0 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
1fdb0 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
1fdc0 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
1fdd0 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
1fde0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
1fdf0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
1fe00 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1fe10 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
1fe20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
1fe30 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
1fe40 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
1fe50 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
1fe60 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
1fe70 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
1fe80 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
1fe90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1fea0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1feb0 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
1fec0 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
1fed0 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
1fee0 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
1fef0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
1ff00 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1ff10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1ff20 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
1ff30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ff40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1ff50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
1ff60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1ff70 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
1ff80 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
1ff90 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
1ffa0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
1ffb0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1ffc0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
1ffd0 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
1ffe0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
1fff0 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20000 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20020 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
20040 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
20050 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
20060 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
20070 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
20080 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
20090 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
200a0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
200b0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
200c0 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
200d0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
200e0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
200f0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20100 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20110 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20120 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20130 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20140 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20150 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20160 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20170 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20180 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
20190 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
201a0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
201b0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
201c0 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
201d0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
201e0 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
201f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20200 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20210 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20220 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20230 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20240 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20250 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20260 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20270 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20280 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
20290 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
202a0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
202b0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
202c0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
202d0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
202e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
202f0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
20300 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20310 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20320 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20330 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
20340 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
20350 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
20360 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20370 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
20380 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
20390 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
203a0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
203b0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
203c0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
203d0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
203e0 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
203f0 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
20400 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
20410 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
20420 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
20430 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20440 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
20450 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20460 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
20470 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
20480 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20490 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
204a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
204b0 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
204c0 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
204d0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
204e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
204f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
20500 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
20510 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20520 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20530 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20540 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20550 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20560 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20570 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20580 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
20590 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
205a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
205b0 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
205c0 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
205d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
205e0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
205f0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
20600 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
20610 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20620 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
20630 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
20640 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20650 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
20660 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
20670 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
20680 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
20690 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
206a0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
206b0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
206c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
206d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
206e0 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
206f0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
20700 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20710 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
20720 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
20730 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
20740 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
20750 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
20760 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
20770 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
20780 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
20790 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
207a0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
207b0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
207c0 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
207d0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
207e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
207f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20800 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
20810 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
20820 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
20830 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
20840 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
20850 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
20860 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
20870 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
20880 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
20890 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
208a0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
208b0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
208c0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
208d0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
208e0 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
208f0 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
20900 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
20910 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
20920 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
20930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20940 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
20950 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
20960 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20970 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
20980 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20990 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
209a0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
209b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
209c0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
209d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
209e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
209f0 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
20a00 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
20a10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
20a20 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
20a30 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
20a40 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
20a50 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20a60 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
20a70 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
20a80 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
20a90 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
20aa0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
20ab0 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
20ac0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
20ad0 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
20ae0 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
20af0 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
20b00 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20b10 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
20b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20b30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
20b40 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
20b50 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
20b60 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
20b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20b80 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
20b90 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20ba0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20bb0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
20bc0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
20bd0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
20be0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
20bf0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
20c00 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
20c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20c20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
20c30 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
20c40 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
20c50 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
20c60 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
20c70 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20c80 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
20c90 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
20ca0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
20cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20cc0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
20cd0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
20ce0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
20cf0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
20d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20d10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
20d20 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
20d30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
20d50 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
20d60 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
20d70 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
20d80 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
20d90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
20da0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
20db0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
20dc0 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
20dd0 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
20de0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
20df0 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
20e00 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
20e10 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
20e20 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
20e30 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
20e40 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
20e50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20e60 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
20e70 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
20e80 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
20e90 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
20ea0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
20eb0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
20ec0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
20ed0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
20ee0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
20ef0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
20f00 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
20f10 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
20f20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20f30 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
20f40 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
20f50 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
20f60 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
20f70 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
20f80 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
20f90 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
20fa0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
20fb0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
20fc0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
20fd0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
20fe0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
20ff0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
21000 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21010 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21020 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
21030 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
21040 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
21050 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
21060 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
21070 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
21080 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
21090 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
210a0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
210b0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
210c0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
210d0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
210e0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
210f0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
21100 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
21110 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
21120 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
21130 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
21140 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
21150 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
21160 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21170 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
21180 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
21190 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
211a0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
211b0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
211c0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
211d0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
211e0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
211f0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
21200 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
21210 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
21220 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
21240 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
21250 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
21260 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
21270 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
21280 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
21290 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
212a0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
212b0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
212c0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
212d0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
212e0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
212f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21300 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
21310 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
21320 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
21330 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
21340 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
21350 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
21360 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
21370 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
21380 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
21390 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
213a0 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
213b0 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
213c0 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
213d0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
213e0 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
213f0 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
21400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21410 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
21420 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
21430 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
21440 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
21450 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
21460 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
21470 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
21480 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
21490 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
214a0 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
214b0 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
214c0 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
214d0 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
214e0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
214f0 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
21500 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
21510 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
21520 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
21530 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
21540 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21550 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
21560 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
21570 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
21580 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
21590 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
215a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
215b0 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
215c0 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
215d0 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
215e0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
215f0 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
21600 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
21610 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
21620 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
21630 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
21640 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
21650 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
21660 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
21670 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
21680 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
21690 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
216a0 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
216b0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
216c0 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
216d0 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
216e0 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
216f0 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
21700 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
21710 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
21720 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
21730 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
21740 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
21750 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
21760 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
21770 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
21780 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
21790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
217a0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
217b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
217c0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
217d0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
217e0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
217f0 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
21800 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
21810 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20  /.  int level,  
21820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
21830 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
21840 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
21850 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20  L, 3=FULL */  . 
21860 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c   int bFullFsync,
21870 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
21880 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20   fullfsync */.  
21890 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  int bCkptFullFsy
218a0 6e 63 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20  nc    /* PRAGMA 
218b0 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
218c0 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  sync */.){.  ass
218d0 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26  ert( level>=1 &&
218e0 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70   level<=3 );.  p
218f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
21900 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
21910 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
21920 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
21930 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
21940 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
21950 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
21960 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
21970 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
21980 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
21990 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
219a0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
219b0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  0;.  }else if( b
219c0 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20  FullFsync ){.   
219d0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
219e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
219f0 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
21a00 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21a10 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21a20 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
21a30 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20   bCkptFullFsync 
21a40 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
21a50 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21a60 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
21a70 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
21a80 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21a90 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
21aa0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
21ab0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
21ac0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21ad0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21ae0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
21af0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21b00 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21b10 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
21b20 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21b30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21b40 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
21b50 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
21b60 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
21b70 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
21b80 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
21b90 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21ba0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
21bb0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
21bc0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
21bd0 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
21be0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
21bf0 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
21c00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
21c10 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
21c20 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
21c30 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
21c40 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
21c50 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
21c60 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
21c70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
21c80 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
21c90 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
21ca0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
21cb0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
21cc0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21cd0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
21ce0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
21cf0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
21d00 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
21d10 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
21d20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
21d30 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
21d40 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
21d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
21d60 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
21d70 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
21d80 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
21d90 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
21da0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
21db0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
21dc0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
21dd0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
21de0 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
21df0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
21e00 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
21e10 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
21e20 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
21e30 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
21e40 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
21e50 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
21e60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
21e70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
21e80 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
21e90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21ea0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
21eb0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
21ec0 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
21ed0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
21ee0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
21ef0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
21f00 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
21f10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
21f20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21f30 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
21f40 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
21f50 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
21f60 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
21f70 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
21f80 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
21f90 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
21fa0 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
21fb0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
21fc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
21fd0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
21fe0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
21ff0 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
22000 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
22010 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
22020 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
22030 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
22040 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
22050 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22060 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
22070 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
22080 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22090 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
220a0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
220b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
220c0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
220d0 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
220e0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
220f0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
22100 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
22110 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
22120 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
22130 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
22140 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
22150 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
22160 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
22170 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
22180 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
22190 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
221a0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
221b0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
221c0 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
221d0 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
221e0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
221f0 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
22200 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
22210 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
22220 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
22230 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
22240 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
22270 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
22280 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
22290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
222a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
222b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
222c0 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
222d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
222e0 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
222f0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
22300 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
22310 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
22320 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
22330 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
22340 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
22350 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
22360 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
22370 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
22380 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
22390 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
223a0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
223b0 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
223c0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
223d0 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
223e0 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
223f0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
22400 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
22410 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
22420 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22430 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
22440 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
22450 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
22460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22470 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
22480 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
22490 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
224a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
224b0 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
224c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
224d0 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
224e0 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
224f0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
22500 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
22510 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
22520 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
22530 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
22540 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
22550 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
22560 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
22570 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rg;.}../*.** Cha
22580 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
22590 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
225a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
225b0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
225c0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
225d0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
225e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
225f0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
22600 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
22610 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
22620 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
22630 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
22640 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
22650 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
22660 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
22670 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
22680 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
22690 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
226a0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
226b0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
226c0 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
226d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
226e0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
226f0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
22700 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
22710 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
22720 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
22730 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
22740 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
22750 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
22760 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
22770 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
22780 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
22790 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
227a0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
227b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
227c0 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
227d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
227e0 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
227f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
22800 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
22810 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
22820 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
22830 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
22840 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
22850 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
22860 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
22870 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
22880 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
22890 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
228a0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
228b0 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
228c0 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
228d0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
228e0 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
228f0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
22900 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
22910 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
22920 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
22930 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
22940 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
22950 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
22960 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22970 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
22980 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
22990 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
229a0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
229b0 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
229c0 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
229d0 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
229e0 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
229f0 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
22a00 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
22a10 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
22a20 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
22a30 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
22a40 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
22a50 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
22a60 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
22a70 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
22a80 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
22a90 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
22aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22ab0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
22ac0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22ad0 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
22ae0 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
22af0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22b00 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
22b10 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
22b20 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
22b30 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
22b40 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
22b50 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
22b60 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
22b70 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
22b80 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
22b90 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
22ba0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
22bb0 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
22bc0 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
22bd0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
22be0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22bf0 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
22c00 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
22c10 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
22c20 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
22c30 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
22c40 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
22c50 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
22c60 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
22c70 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
22c80 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
22c90 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
22ca0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
22cb0 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
22cc0 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
22cd0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
22ce0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
22cf0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
22d00 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
22d10 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
22d20 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
22d30 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
22d40 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
22d50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
22d60 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
22d70 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
22d80 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
22d90 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
22da0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
22db0 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
22dc0 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
22dd0 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22df0 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
22e00 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
22e10 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
22e20 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
22e30 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
22e40 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
22e50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22e60 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
22e70 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
22e80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22ea0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
22eb0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
22ec0 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
22ed0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
22ee0 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
22ef0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
22f00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
22f20 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
22f30 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
22f40 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
22f50 29 28 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65  )(nByte/pageSize
22f60 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
22f70 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
22f80 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
22f90 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
22fa0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
22fb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
22fc0 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
22fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
22fe0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
22ff0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
23000 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
23010 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
23020 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
23030 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
23040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23050 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
23060 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
23070 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
23080 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
23090 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
230a0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
230b0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
230c0 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
230d0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
230e0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
230f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23100 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23110 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
23120 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
23130 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
23140 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
23150 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
23160 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
23170 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
23180 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
23190 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
231a0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
231b0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
231c0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
231d0 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
231e0 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
231f0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
23200 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
23210 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
23220 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
23230 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
23240 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
23250 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
23260 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
23270 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
23280 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
23290 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
232a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
232b0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
232c0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
232d0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
232e0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
232f0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
23300 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
23310 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
23320 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
23330 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
23340 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
23350 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
23360 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
23370 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
23380 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
23390 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
233a0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
233b0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
233c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
233d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
233e0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
233f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
23400 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
23410 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
23420 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
23430 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
23440 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
23450 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
23460 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
23470 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
23480 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
23490 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
234a0 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
234b0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
234c0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
234d0 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
234e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
234f0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
23500 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
23510 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
23520 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
23530 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
23540 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
23550 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
23560 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
23570 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
23580 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
23590 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
235a0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
235b0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
235c0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
235d0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
235e0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
235f0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
23600 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
23610 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
23620 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
23630 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
23640 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
23650 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
23660 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
23670 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
23680 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
23690 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
236a0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
236b0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
236c0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
236d0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
236e0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
236f0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
23700 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
23710 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
23720 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
23730 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
23740 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
23750 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
23760 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23770 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
23780 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
23790 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
237a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
237b0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
237c0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
237d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
237e0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
237f0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
23800 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
23810 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
23820 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
23830 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
23840 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
23850 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
23860 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
23870 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
23880 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
23890 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
238a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
238b0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
238c0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
238d0 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
238e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
238f0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
23900 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
23910 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
23920 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
23930 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
23940 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
23950 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
23960 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
23970 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
23980 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
23990 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
239a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
239b0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
239c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
239d0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
239e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
239f0 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
23a00 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
23a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23a20 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
23a30 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
23a40 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
23a50 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
23a60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23a70 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
23a80 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
23a90 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
23aa0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
23ab0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
23ac0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
23ad0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
23ae0 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
23af0 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
23b00 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
23b10 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
23b20 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
23b30 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
23b40 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
23b50 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
23b60 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
23b70 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
23b80 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
23b90 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23ba0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
23bb0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
23bc0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
23bd0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
23be0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
23bf0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
23c00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
23c10 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
23c20 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
23c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23c60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23c70 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
23c80 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
23c90 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
23ca0 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
23cb0 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
23cc0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
23cd0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
23ce0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
23cf0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
23d00 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
23d10 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
23d20 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
23d30 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
23d40 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
23d50 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
23d60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23d70 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
23d80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
23d90 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
23da0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
23db0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
23dc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23dd0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
23de0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
23df0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
23e00 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
23e10 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
23e20 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
23e30 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
23e40 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
23e50 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
23e60 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
23e70 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
23e80 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
23e90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
23ea0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
23eb0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
23ec0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
23ed0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
23ee0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
23ef0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
23f00 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
23f10 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
23f20 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
23f30 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
23f40 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
23f50 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
23f60 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
23f70 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
23f80 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
23f90 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
23fa0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
23fb0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
23fc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23fd0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
23fe0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
23ff0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
24000 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
24010 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
24020 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
24030 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
24040 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
24050 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
24060 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24070 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
24080 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
24090 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
240a0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
240b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
240e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
240f0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
24100 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
24110 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
24120 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
24130 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
24140 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66   held, or one of
24150 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e   the transistion
24160 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
24170 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
24180 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
24190 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
241a0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
241b0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
241c0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
241d0 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
241e0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
241f0 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
24200 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
24210 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
24220 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
24230 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
24240 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
24250 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
24260 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
24270 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
24280 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
24290 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
242a0 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
242b0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
242c0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
242d0 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
242e0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
242f0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
24300 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24310 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
24320 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
24330 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
24340 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
24350 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
24360 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
24370 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
24380 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
24390 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
243a0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
243b0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
243c0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
243d0 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
243e0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
243f0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
24400 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
24410 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
24420 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
24430 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
24440 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
24450 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
24460 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
24470 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
24480 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
24490 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
244a0 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
244b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
244c0 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
244d0 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
244e0 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
244f0 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
24500 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
24510 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
24520 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
24530 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
24540 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
24550 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
24560 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
24570 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
24580 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
24590 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
245a0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
245b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
245c0 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
245d0 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
245e0 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
245f0 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
24600 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
24610 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72  orrect behaviour
24620 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
24630 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
24640 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
24650 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
24660 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
24670 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
24680 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
24690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
246a0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
246b0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
246c0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
246d0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
246e0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
246f0 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
24700 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
24710 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
24720 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
24730 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
24740 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
24750 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
24760 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
24770 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
24780 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
24790 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
247a0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
247b0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
247c0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
247d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
247e0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
247f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
24800 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
24810 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
24820 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
24830 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
24840 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
24850 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24870 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
24880 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
24890 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
248a0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
248b0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
248c0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
248d0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
248e0 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
248f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
24900 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
24910 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
24920 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
24930 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
24940 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
24950 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
24960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24970 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
24980 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
24990 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
249a0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
249b0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
249c0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
249d0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
249e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
249f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
24a00 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
24a10 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
24a20 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
24a30 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
24a40 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
24a50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
24a60 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
24a70 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24a80 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
24a90 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
24aa0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
24ab0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
24ac0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
24ad0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
24ae0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24af0 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
24b00 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
24b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
24b20 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
24b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24b40 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
24b50 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
24b60 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
24b70 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
24b80 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
24b90 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
24ba0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
24bb0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
24bc0 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
24bd0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
24be0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
24bf0 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
24c00 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
24c10 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
24c20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
24c30 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
24c40 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
24c50 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
24c60 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
24c70 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
24c80 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
24c90 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
24ca0 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
24cb0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
24cc0 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
24cd0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
24ce0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
24cf0 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
24d00 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
24d10 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
24d20 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
24d30 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
24d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
24d50 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
24d60 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
24d70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24d80 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
24d90 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
24da0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24db0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
24dc0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
24dd0 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
24de0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24df0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
24e00 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
24e10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
24e20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
24e30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24e40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
24e50 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
24e60 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
24e70 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
24e80 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
24e90 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
24ea0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
24eb0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
24ec0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
24ed0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
24ee0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
24ef0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
24f00 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
24f10 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
24f20 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
24f30 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
24f40 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
24f50 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
24f60 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
24f70 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
24f80 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24f90 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
24fa0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
24fb0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
24fc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
24fd0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
24fe0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
24ff0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
25000 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
25010 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
25020 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25030 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
25040 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
25050 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
25060 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
25070 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
25080 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
25090 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
250a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
250b0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
250c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
250d0 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
250e0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
250f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
25100 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
25110 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62  ager) );.  disab
25120 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25130 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
25140 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
25150 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61  lloc();.  /* pPa
25160 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
25170 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
25180 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
25190 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
251a0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
251b0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
251c0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
251d0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
251e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
251f0 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
25200 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
25210 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
25220 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
25230 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
25240 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
25250 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
25260 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
25270 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
25280 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
25290 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
252a0 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
252b0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
252c0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
252d0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
252e0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
252f0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
25300 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
25310 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
25320 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
25330 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
25340 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
25350 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
25360 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
25370 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
25380 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
25390 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
253a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
253b0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
253c0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
253d0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
253e0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
253f0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
25400 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
25410 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
25420 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
25430 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
25440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
25450 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
25460 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
25470 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
25480 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
25490 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
254a0 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
254b0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
254c0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
254d0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
254e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
254f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
25500 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25510 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
25520 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
25530 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
25540 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
25550 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
25560 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
25570 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
25580 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
25590 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
255a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
255b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
255c0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
255d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
255e0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
255f0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
25600 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
25610 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
25620 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
25630 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
25640 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
25650 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
25660 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
25670 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
25680 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
25690 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
256a0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
256b0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
256c0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
256d0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
256e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
256f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
25700 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
25710 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
25720 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
25730 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
25740 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
25750 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
25760 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
25770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25780 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
25790 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
257a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
257b0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
257c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
257d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
257e0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
257f0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
25800 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
25810 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
25820 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
25830 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
25840 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
25850 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
25860 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
25870 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
25880 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
25890 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
258a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
258b0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
258c0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
258d0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
258e0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
258f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
25900 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
25910 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
25920 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
25930 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
25940 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
25950 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
25960 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
25970 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
25980 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
25990 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
259a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
259b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
259c0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
259d0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
259e0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
259f0 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
25a00 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
25a10 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
25a20 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
25a30 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
25a40 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
25a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25a60 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
25a70 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
25a80 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
25a90 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
25aa0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
25ab0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
25ac0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
25ad0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
25ae0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
25af0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
25b00 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
25b10 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
25b20 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
25b30 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
25b40 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
25b50 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
25b60 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
25b70 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
25b80 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
25b90 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
25ba0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
25bb0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
25bc0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
25bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25be0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
25bf0 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
25c00 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
25c10 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
25c20 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
25c30 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
25c40 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
25c50 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
25c60 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
25c70 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
25c80 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
25c90 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
25ca0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
25cb0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
25cc0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
25cd0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
25ce0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
25cf0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
25d00 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
25d10 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
25d20 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
25d30 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
25d40 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
25d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
25d60 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
25d70 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
25d80 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
25d90 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
25da0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
25db0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
25dc0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
25dd0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
25de0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
25df0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
25e00 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
25e10 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
25e20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25e30 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
25e40 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
25e50 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
25e60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25e70 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
25e80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25ea0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25eb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25ec0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25ed0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
25ee0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
25ef0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25f00 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
25f10 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
25f20 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
25f30 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
25f40 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
25f50 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
25f60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
25f70 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
25f80 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
25f90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25fa0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
25fb0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
25fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
25fd0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25fe0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
25ff0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
26000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26010 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
26020 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
26030 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
26040 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
26050 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
26060 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
26070 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
26080 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
26090 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
260a0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
260b0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
260c0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
260d0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
260e0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
260f0 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
26100 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
26110 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
26120 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
26130 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
26140 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
26150 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
26160 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
26170 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
26180 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
26190 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
261a0 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
261b0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
261c0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
261d0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
261e0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
261f0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
26200 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
26210 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
26220 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
26230 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
26240 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
26250 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
26260 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
26270 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
26280 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
26290 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
262a0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
262b0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
262c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
262d0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
262e0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
262f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26300 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
26310 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
26320 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
26330 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
26340 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
26350 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
26360 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
26370 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
26380 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
26390 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
263a0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
263b0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
263c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
263d0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
263e0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
263f0 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
26400 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
26410 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
26420 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
26430 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
26440 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26450 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
26460 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
26470 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
26480 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
26490 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
264a0 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
264b0 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
264c0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
264d0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
264e0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
264f0 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
26500 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
26510 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
26520 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
26530 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
26540 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
26550 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
26560 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
26570 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
26580 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
26590 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
265a0 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
265b0 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
265c0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
265d0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
265e0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
265f0 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
26600 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
26610 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
26620 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
26630 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26640 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
26650 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
26660 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
26670 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
26680 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26690 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
266a0 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
266b0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
266c0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
266d0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
266e0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
266f0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
26700 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
26710 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
26720 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
26730 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
26740 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
26750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26760 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
26770 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
26780 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
26790 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
267a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
267b0 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
267c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
267d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
267e0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
267f0 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
26800 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26810 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
26820 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
26830 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
26840 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
26850 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
26870 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
26880 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
26890 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
268a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
268b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
268c0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
268d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
268e0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
268f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
26900 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
26910 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
26920 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
26930 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
26940 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
26950 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
26960 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
26970 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
26980 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
26990 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
269a0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
269b0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
269c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
269d0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
269e0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
269f0 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
26a00 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
26a10 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
26a20 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
26a30 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
26a40 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
26a50 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
26a60 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
26a70 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
26a80 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
26a90 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
26aa0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
26ab0 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
26ac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
26ad0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
26ae0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
26af0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
26b00 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
26b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26b20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
26b30 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
26b40 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
26b50 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
26b60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
26b70 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
26b80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26b90 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
26ba0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
26bb0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
26bc0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
26bd0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26be0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
26bf0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
26c00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26c10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26c20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26c30 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
26c40 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
26c50 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
26c60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26c70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
26c80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
26c90 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
26ca0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
26cb0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
26cc0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
26cd0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
26ce0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26cf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26d10 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
26d20 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26d30 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26d40 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
26d50 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
26d60 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
26d70 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
26d80 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26d90 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
26da0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
26db0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
26dc0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
26dd0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
26de0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
26df0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
26e00 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
26e10 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
26e20 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
26e30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
26e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26e60 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
26e70 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26e80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26e90 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
26ea0 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
26eb0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
26ec0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
26ed0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
26ee0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
26ef0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
26f00 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
26f10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26f20 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26f30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
26f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
26f50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
26f60 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
26f70 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
26f80 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
26f90 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
26fa0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
26fb0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
26fc0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
26fd0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
26fe0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
26ff0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
27000 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
27010 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
27020 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
27030 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
27040 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
27050 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
27060 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
27070 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
27080 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
27090 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
270a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
270b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
270c0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
270d0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
270e0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
270f0 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
27100 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
27110 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
27120 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
27130 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
27140 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
27150 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
27160 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
27170 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
27180 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
27190 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
271a0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
271b0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
271c0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
271d0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
271e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
271f0 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
27200 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
27210 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
27220 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
27230 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
27240 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
27250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27260 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
27270 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
27280 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
27290 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
272a0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
272b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
272c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
272d0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
272e0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
272f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
27300 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
27310 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
27320 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
27330 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
27340 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
27350 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
27360 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
27370 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
27380 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
27390 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
273a0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
273b0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
273c0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
273d0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
273e0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
273f0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
27400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
27410 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
27420 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
27430 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
27440 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
27450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
27460 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
27470 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
27480 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
27490 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
274a0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
274b0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
274c0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
274d0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
274e0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
274f0 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
27500 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
27510 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
27520 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
27530 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
27540 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
27550 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
27560 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
27570 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
27580 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
27590 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
275a0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
275b0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
275c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
275d0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
275e0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
275f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27600 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
27610 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
27620 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
27630 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
27640 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
27650 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
27660 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
27670 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
27680 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
27690 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
276a0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
276b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
276c0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
276d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
276e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
276f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27700 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
27710 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
27720 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
27730 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
27740 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
27750 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
27760 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27770 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
27780 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
27790 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
277a0 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
277b0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
277c0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
277d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
277e0 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
277f0 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
27800 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
27810 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
27820 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
27830 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
27840 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
27850 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
27860 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
27870 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
27880 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
27890 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
278a0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
278b0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
278c0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
278d0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
278e0 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
278f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
27900 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
27910 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
27920 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
27930 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
27940 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
27950 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
27960 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
27970 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
27980 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
27990 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
279a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
279b0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
279c0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
279d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
279e0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
279f0 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  e>pPager->dbHint
27a00 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Size ){.    sqli
27a10 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
27a20 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
27a30 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
27a40 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
27a50 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
27a60 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 4e 6f 46  OsFileControlNoF
27a70 61 69 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ail(pPager->fd, 
27a80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
27a90 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
27aa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
27ab0 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
27ac0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
27ad0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
27ae0 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
27af0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
27b00 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
27b10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
27b20 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
27b30 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
27b40 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
27b50 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
27b60 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
27b70 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
27b80 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
27b90 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
27ba0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
27bb0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
27bc0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
27bd0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
27be0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
27bf0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
27c00 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
27c10 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
27c20 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
27c30 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
27c40 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
27c50 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
27c60 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
27c70 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
27c80 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
27c90 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
27ca0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
27cb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
27cc0 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
27cd0 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
27ce0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
27cf0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
27d00 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
27d10 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
27d20 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
27d30 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
27d40 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
27d70 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
27d80 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
27d90 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
27da0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
27db0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
27dc0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
27dd0 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
27de0 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
27df0 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
27e00 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
27e10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
27e20 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
27e30 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
27e40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
27e50 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
27e60 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
27e70 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
27e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27e90 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
27ea0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
27eb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
27ec0 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
27ed0 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
27ee0 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
27ef0 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
27f00 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
27f10 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
27f20 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
27f30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27f40 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
27f50 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
27f60 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
27f70 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
27f80 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
27f90 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
27fa0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
27fb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
27fc0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
27fd0 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
27fe0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
27ff0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
28000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28010 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
28020 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
28030 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
28040 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
28050 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
28060 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
28070 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
28080 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
28090 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
280a0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
280b0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
280c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
280d0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
280e0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
280f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
28100 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
28110 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28140 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
28150 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
28160 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
28170 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
28180 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
28190 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
281a0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
281b0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
281c0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
281d0 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
281e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
281f0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28200 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
28210 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28220 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
28230 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
28240 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
28250 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
28260 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
28270 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
28280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
28290 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
282a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
282b0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
282c0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
282d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
282e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
282f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
28300 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
28310 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
28320 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
28330 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
28340 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
28350 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
28360 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
28370 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
28380 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28390 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
283a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
283b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
283c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
283d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
283e0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
283f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
28400 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
28410 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
28420 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
28430 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
28440 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
28450 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
28460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28470 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
28480 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
28490 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
284a0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
284b0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
284c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
284d0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
284e0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
284f0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
28500 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
28510 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
28520 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
28530 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
28540 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
28550 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
28560 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
28570 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
28580 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
28590 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
285a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
285b0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
285c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
285d0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
285e0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
285f0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
28600 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
28610 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
28620 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
28630 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
28640 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
28650 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
28660 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
28670 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
28680 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
28690 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
286a0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
286b0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
286c0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
286d0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
286e0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
286f0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
28700 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
28710 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
28720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28730 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
28740 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
28750 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
28760 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
28770 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
28780 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
28790 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
287a0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
287b0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
287c0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
287d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
287e0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
287f0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
28800 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
28810 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
28820 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
28830 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28840 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
28850 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
28860 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
28870 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
28880 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
28890 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
288a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
288b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
288c0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
288d0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
288e0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
288f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28900 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
28910 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
28920 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
28930 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
28940 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
28950 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
28960 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
28970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
28990 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
289a0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
289b0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
289c0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
289d0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
289e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
289f0 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
28a00 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
28a10 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
28a20 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
28a30 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
28a40 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
28a50 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
28a60 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
28a70 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28a80 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
28a90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
28aa0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
28ab0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
28ac0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
28ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28ae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
28af0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28b00 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
28b10 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
28b20 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
28b30 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
28b40 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
28b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28b60 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
28b70 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
28b80 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
28b90 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
28ba0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
28bb0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
28bc0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
28bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28be0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
28bf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
28c00 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
28c10 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
28c20 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
28c30 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
28c40 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
28c50 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
28c60 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
28c70 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
28c80 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
28c90 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
28ca0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
28cb0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
28cc0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
28cd0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
28ce0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
28cf0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
28d00 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
28d10 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
28d20 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
28d30 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
28d40 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
28d50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
28d60 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
28d70 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
28d80 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
28d90 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
28da0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28db0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
28dc0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
28dd0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
28de0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28df0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
28e00 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
28e10 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
28e20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
28e30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
28e40 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
28e50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
28e60 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
28e70 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
28e80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
28e90 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
28ea0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
28eb0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
28ec0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
28ed0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
28ee0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
28ef0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
28f00 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
28f10 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
28f20 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
28f30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
28f40 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
28f50 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
28f60 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28f70 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
28f80 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
28f90 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
28fa0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
28fb0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
28fc0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
28fd0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
28fe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
28ff0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
29000 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
29010 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
29020 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
29030 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
29040 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
29050 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
29060 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
29070 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
29080 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
29090 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
290a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
290b0 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
290c0 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
290d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
290e0 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
290f0 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
29100 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
29110 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
29120 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
29130 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
29140 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e  NotSpill flag in
29150 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
29160 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64   spilling regard
29170 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a  less of whether.
29180 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79    ** or not a sy
29190 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
291a0 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
291b0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
291c0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
291d0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
291e0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
291f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
29200 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
29210 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
29220 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
29230 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
29240 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69   implementaton i
29250 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
29260 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
29270 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
29280 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
29290 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20   createFlag==1. 
292a0 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
292b0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
292c0 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
292d0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
292e0 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
292f0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
29300 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
29310 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
29320 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
29330 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
29340 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
29350 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
29360 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
29370 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
29380 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
29390 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
293a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
293b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
293c0 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ill ) return SQL
293d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
293e0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
293f0 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c  pill && (pPg->fl
29400 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
29410 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20  _SYNC)!=0 ){.   
29420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29430 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70  K;.  }..  pPg->p
29440 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
29450 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
29460 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
29470 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
29480 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
29490 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
294a0 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
294b0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
294c0 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  { .      rc = su
294d0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
294e0 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ); .    }.    if
294f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29500 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
29510 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
29520 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
29530 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29540 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
29550 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
29560 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
29570 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
29580 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29590 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
295a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
295b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
295c0 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
295d0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
295e0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
295f0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
29600 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29610 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
29620 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
29630 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
29640 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
29650 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
29660 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
29670 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
29680 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54  ournal..    ** T
29690 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
296a0 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
296b0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
296c0 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
296d0 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
296e0 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
296f0 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
29700 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  case..    **.   
29710 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
29720 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
29730 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
29740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42     **.    **   B
29750 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20  EGIN;.    **    
29760 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
29770 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f  >.    **     <mo
29780 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20  dify page X>.   
29790 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
297a0 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20  T sp;.    **    
297b0 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
297c0 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
297d0 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ges>.    **     
297e0 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61    pagerStress(pa
297f0 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20  ge X).    **    
29800 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
29810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
29820 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68  f (X>Y), then wh
29830 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69  en pagerStress i
29840 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20  s called page X 
29850 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
29860 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  ten.    ** out t
29870 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29880 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
29890 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
298a0 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
298b0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
298c0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
298d0 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
298e0 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
298f0 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20  ill read.    ** 
29900 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
29910 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
29920 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
29930 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
29940 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68  it.    ** was wh
29950 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
29960 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
29970 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
29980 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
29990 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65    ** was execute
299a0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
299b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
299c0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
299d0 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
299e0 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
299f0 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e      ** sub-journ
29a00 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20  al file now (if 
29a10 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
29a20 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61  y there), so tha
29a30 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  t it will.    **
29a40 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
29a50 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
29a60 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
29a70 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
29a80 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e      ** executed.
29a90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29aa0 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72  NEVER(.        r
29ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29ac0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
29ad0 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a  ->dbSize && subj
29ae0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29af0 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20  ).    ) ){.     
29b00 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
29b10 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
29b20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
29b30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29b40 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
29b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29b60 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
29b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
29b90 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
29ba0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
29bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29bc0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29bd0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
29be0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
29bf0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
29c00 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
29c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29c20 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
29c30 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
29c40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29c50 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
29c60 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
29c70 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
29c80 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
29c90 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
29ca0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
29cb0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
29cc0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
29cd0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
29ce0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
29cf0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
29d00 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
29d10 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
29d20 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
29d30 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
29d40 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
29d50 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
29d60 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
29d70 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
29d80 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
29d90 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
29da0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
29db0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
29dc0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
29dd0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
29de0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
29df0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
29e00 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
29e10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
29e20 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
29e30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
29e40 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
29e50 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
29e60 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
29e70 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
29e80 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
29e90 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
29ea0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
29eb0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
29ec0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
29ed0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
29ee0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
29ef0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
29f00 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
29f10 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
29f20 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
29f30 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
29f40 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
29f50 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
29f60 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
29f70 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
29f80 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
29f90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
29fa0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
29fb0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
29fc0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
29fd0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
29fe0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
29ff0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2a000 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2a010 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2a020 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2a030 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2a040 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
2a050 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
2a060 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
2a070 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2a080 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2a090 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2a0a0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2a0b0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2a0c0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2a0d0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2a0e0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2a0f0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2a100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2a110 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2a120 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2a130 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2a140 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2a150 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2a160 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a170 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2a180 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2a190 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2a1a0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2a1b0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2a1c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2a1d0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2a1e0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2a1f0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2a200 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2a210 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2a220 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2a230 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2a240 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2a250 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2a260 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2a270 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2a280 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2a290 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2a2a0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2a2b0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2a2c0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2a2d0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2a2e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2a2f0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2a300 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2a310 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2a320 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2a330 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2a340 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a350 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2a360 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2a370 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2a380 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2a390 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2a3a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3c0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2a3d0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2a3e0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2a3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2a400 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2a410 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2a420 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2a430 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2a440 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2a450 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2a460 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2a470 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2a480 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2a490 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2a4a0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2a4b0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2a4c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a4d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2a4e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2a4f0 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2a500 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2a510 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2a520 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2a530 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2a540 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2a550 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a560 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2a570 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2a580 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2a590 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2a5a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2a5b0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2a5c0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2a5d0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2a5e0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2a5f0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2a600 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2a610 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a620 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2a630 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2a640 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2a650 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2a660 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2a670 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2a680 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2a690 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2a6a0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2a6b0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2a6c0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2a6d0 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
2a6e0 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
2a6f0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
2a700 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
2a710 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
2a720 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
2a730 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
2a740 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
2a750 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2a760 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
2a770 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44  */.  u32 szPageD
2a780 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
2a790 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2a7a0 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
2a7b0 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   size */.  const
2a7c0 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b   char *zUri = 0;
2a7d0 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20      /* URI args 
2a7e0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2a7f0 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20   nUri = 0;      
2a800 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a810 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20  of bytes of URI 
2a820 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f  args at *zUri */
2a830 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2a840 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2a850 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2a860 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2a870 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2a880 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2a890 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2a8a0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2a8b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
2a8c0 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
2a8d0 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
2a8e0 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
2a8f0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
2a900 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
2a910 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
2a920 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2a930 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
2a940 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
2a950 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
2a960 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
2a970 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
2a980 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
2a990 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
2a9a0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
2a9b0 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
2a9c0 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
2a9d0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a9e0 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
2a9f0 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
2aa00 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
2aa10 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2aa20 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
2aa30 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2aa40 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
2aa50 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2aa60 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
2aa70 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
2aa80 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
2aa90 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2aaa0 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
2aab0 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
2aac0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
2aad0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
2aae0 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
2aaf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
2ab00 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
2ab10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2ab20 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
2ab30 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41    if( flags & PA
2ab40 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  GER_MEMORY ){.  
2ab50 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
2ab60 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2ab70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2ab80 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2ab90 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2aba0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2abb0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2abc0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2abd0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2abe0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2abf0 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2ac00 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2ac10 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2ac20 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2ac30 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2ac40 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2ac50 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2ac60 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2ac70 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2ac80 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2ac90 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2aca0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2acb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
2acc0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2acd0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2ace0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2acf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ad00 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2ad10 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2ad20 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2ad30 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2ad40 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2ad50 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2ad60 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2ad70 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2ad80 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2ad90 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2ada0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2adb0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2adc0 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2add0 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2ade0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2adf0 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2ae00 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2ae10 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2ae20 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2ae30 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2ae40 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2ae50 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2ae60 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2ae70 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2ae80 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2ae90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aea0 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2aeb0 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2aec0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2aed0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2aee0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2aef0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2af00 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2af10 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2af20 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2af30 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2af40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2af50 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2af60 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2af70 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2af80 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2af90 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2afa0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2afb0 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2afc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2afd0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2afe0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2aff0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2b000 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2b010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b020 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2b030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b040 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2b060 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
2b070 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b080 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b090 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2b0a0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2b0b0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2b0c0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2b0d0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2b0e0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2b0f0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2b100 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2b110 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2b120 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2b130 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2b140 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2b150 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2b180 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2b190 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2b1c0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2b1d0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2b1e0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2b1f0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2b200 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2b210 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2b220 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2b230 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2b240 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2b250 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2b260 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2b270 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2b280 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2b290 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2b2a0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2b2b0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2b2c0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2b2d0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2b2e0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2b2f0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2b300 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2b310 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2b320 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2b330 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2b340 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2b350 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2b360 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2b370 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2b380 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2b390 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2b3a0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2b3b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2b3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2b3d0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2b3e0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b3f0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2b400 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2b410 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2b420 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2b430 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2b440 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2b450 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2b460 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2b470 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2b480 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2b490 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2b4a0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2b4b0 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2b4c0 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2b4d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2b4e0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2b4f0 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2b500 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2b510 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2b520 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2b530 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2b540 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2b550 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b560 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2b570 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2b580 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2b590 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2b5a0 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2b5b0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2b5c0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2b5d0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2b5e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2b5f0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2b600 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2b610 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2b620 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2b630 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2b640 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2b650 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2b660 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2b670 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2b680 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2b690 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2b6a0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2b6b0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2b6c0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2b6d0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2b6e0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2b6f0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2b700 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2b710 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2b720 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2b730 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2b740 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2b750 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b760 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2b770 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2b780 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2b790 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2b7a0 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2b7b0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2b7c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2b7d0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2b7e0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2b7f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b800 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20  e[nPathname+1], 
2b810 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
2b820 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2b830 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2b840 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2b850 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2b860 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2b870 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2b880 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 31 29 3b 0a  nal\000", 8+1);.
2b890 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2b8a0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2b8b0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2b8c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2b8d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b8e0 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2b8f0 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2b900 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2b910 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2b920 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2b930 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2b940 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2b950 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2b960 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2b970 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b  -wal\000", 4+1);
2b980 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2b990 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2b9a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2b9b0 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2b9c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b9d0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
2b9e0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2b9f0 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2ba00 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2ba10 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2ba20 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2ba30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2ba40 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2ba50 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2ba60 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2ba90 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2baa0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2bab0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2bac0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2bad0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2bae0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2baf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2bb00 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2bb10 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2bb20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2bb30 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2bb40 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2bb50 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2bb60 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2bb70 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2bb80 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2bb90 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2bba0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2bbb0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2bbc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2bbd0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2bbe0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2bbf0 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2bc00 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2bc10 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bc20 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2bc30 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2bc40 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2bc50 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2bc60 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2bc70 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2bc80 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2bc90 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2bca0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2bcb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
2bcc0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2bcd0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2bce0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
2bcf0 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2bd00 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2bd10 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2bd20 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2bd30 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2bd40 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2bd50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2bd60 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2bd70 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2bd80 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bd90 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2bda0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2bdb0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2bdc0 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2bdd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bde0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2bdf0 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2be00 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2be10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
2be20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2be30 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2be40 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
2be50 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2be60 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2be70 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2be80 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  fd);.        int
2be90 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
2bea0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2beb0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2bec0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2bed0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2bee0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2bef0 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2bf00 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2bf10 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2bf20 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2bf30 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2bf40 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2bf50 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2bf60 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2bf70 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2bf80 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2bf90 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2bfa0 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2bfb0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2bfc0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2bfd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bfe0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2bff0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2c000 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
2c010 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
2c020 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
2c030 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
2c040 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
2c050 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
2c060 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
2c070 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
2c080 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
2c090 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
2c0a0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
2c0b0 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
2c0c0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
2c0d0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2c0e0 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
2c0f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2c100 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
2c110 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
2c120 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2c130 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
2c140 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2c150 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
2c160 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
2c170 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
2c180 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2c190 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
2c1a0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2c1b0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2c1c0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
2c1d0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
2c1e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
2c1f0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2c200 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2c210 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2c220 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2c230 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2c240 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2c250 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2c260 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2c270 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2c280 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2c290 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2c2a0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2c2b0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2c2c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c2d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2c2e0 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2c2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2c300 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2c310 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2c320 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2c330 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2c340 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
2c350 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2c360 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
2c370 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
2c380 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
2c390 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2c3a0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2c3b0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2c3c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c3d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2c3e0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
2c3f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
2c400 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2c410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2c420 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2c430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c440 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2c450 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2c460 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
2c470 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2c480 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2c490 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
2c4a0 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2c4b0 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2c4c0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2c4e0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2c4f0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2c500 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2c510 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
2c520 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2c530 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2c540 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2c550 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2c560 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2c570 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2c580 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2c590 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2c5a0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2c5b0 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2c5c0 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
2c5d0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
2c5e0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
2c5f0 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
2c600 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2c610 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c620 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2c630 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c640 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2c650 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c660 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2c670 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2c680 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2c690 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2c6a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2c6b0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2c6c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2c6d0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2c6e0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2c6f0 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20  LOCK; */.#if 0. 
2c700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c710 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
2c720 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
2c730 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
2c740 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a  LOCK) );.#endif.
2c750 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2c760 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2c770 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2c780 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2c790 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2c7a0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2c7b0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2c7c0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2c7d0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2c7e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2c7f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2c800 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2c810 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2c820 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2c830 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2c840 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2c850 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2c860 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2c870 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2c880 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2c890 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2c8a0 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2c8b0 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2c8c0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2c8d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2c8e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2c8f0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2c900 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
2c910 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2c920 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c930 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20  er->fullSync==0 
2c940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c950 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2c960 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2c970 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t( pPager->walSy
2c980 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2c990 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c9a0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d  ->ckptSyncFlags=
2c9b0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2c9c0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2c9d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2c9e0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2c9f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2ca00 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
2ca10 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
2ca20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2ca30 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52  AL | WAL_SYNC_TR
2ca40 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20  ANSACTIONS;.    
2ca50 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2ca60 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2ca70 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
2ca80 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2ca90 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2caa0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2cab0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2cac0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2cad0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2cae0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2caf0 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2cb00 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2cb10 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2cb20 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2cb30 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2cb40 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2cb50 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2cb60 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2cb70 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2cb80 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2cb90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2cba0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2cbb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2cbc0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2cbd0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2cbe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2cbf0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2cc00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2cc10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2cc20 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2cc30 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2cc40 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2cc50 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2cc60 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2cc70 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2cc80 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2cc90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2cca0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2ccb0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2ccc0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2ccd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
2cce0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ccf0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2cd00 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2cd10 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2cd20 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2cd30 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2cd40 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2cd50 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2cd60 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2cd70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2cd80 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2cd90 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2cda0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2cdb0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2cdc0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2cdd0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2cde0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2cdf0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2ce00 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2ce10 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2ce20 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2ce30 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ce40 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2ce50 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2ce60 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2ce70 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2ce80 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2ce90 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2cea0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2ceb0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2cec0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2ced0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2cee0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2cef0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2cf00 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2cf10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2cf20 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2cf30 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2cf40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2cf50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cf60 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2cf70 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2cf80 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2cf90 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2cfa0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2cfb0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2cfc0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2cfd0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2cfe0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2cff0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2d000 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2d010 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2d020 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2d030 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2d040 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2d050 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2d060 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2d070 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2d080 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2d090 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2d0a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2d0b0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2d0c0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2d0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2d0e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2d0f0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2d100 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2d110 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2d120 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2d130 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2d140 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2d150 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2d160 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2d170 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2d180 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2d190 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2d1a0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2d1b0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2d1c0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2d1d0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2d1e0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2d1f0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2d200 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2d210 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2d220 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2d230 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2d240 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2d250 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2d260 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2d270 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2d280 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2d290 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2d2a0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2d2b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2d2c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2d2d0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2d2e0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2d2f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2d300 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2d310 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2d320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d330 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2d340 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2d350 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2d360 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2d370 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2d380 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2d390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d3b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2d3c0 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2d3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d3e0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2d3f0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2d400 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2d410 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2d420 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2d430 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2d440 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2d450 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2d460 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2d470 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2d480 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2d490 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2d4a0 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2d4b0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2d4c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2d4d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2d4e0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2d4f0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2d500 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2d510 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2d520 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2d530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d540 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2d550 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2d560 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2d570 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2d580 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2d590 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2d5a0 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2d5b0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2d5c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d5d0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2d5e0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2d5f0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2d600 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2d610 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2d620 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2d630 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2d640 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2d650 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2d660 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2d670 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2d680 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2d690 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2d6a0 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2d6b0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2d6c0 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2d6d0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2d6e0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2d6f0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2d700 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2d710 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2d720 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2d730 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2d740 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2d750 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2d760 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2d770 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2d780 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2d790 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2d7a0 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2d7b0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2d7c0 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2d7d0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2d7e0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2d7f0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2d800 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2d810 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2d820 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2d830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d840 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2d850 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2d860 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d870 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d880 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2d890 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2d8a0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
2d8b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2d8c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
2d8d0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
2d8e0 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
2d8f0 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2d900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
2d910 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
2d920 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
2d930 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
2d940 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
2d950 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
2d960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
2d970 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
2d980 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
2d990 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
2d9a0 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
2d9b0 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
2d9c0 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
2d9d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d9e0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2d9f0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2da00 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2da10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2da20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2da30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2da40 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2da50 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2da60 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2da70 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2da80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2da90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2daa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dab0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2dac0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2dad0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2dae0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2daf0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2db00 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2db10 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2db20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2db30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2db40 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2db50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2db60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2db70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2db80 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2db90 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2dba0 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2dbb0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2dbc0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2dbd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2dbe0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2dbf0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2dc00 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2dc10 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2dc20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2dc30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2dc40 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2dc50 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2dc60 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2dc70 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2dc80 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2dc90 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2dca0 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2dcb0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2dcc0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2dcd0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2dce0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
2dcf0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
2dd00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2dd10 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2dd20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2dd30 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2dd40 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2dd50 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2dd60 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
2dd70 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2dd80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2dd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
2dda0 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
2ddb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2ddc0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2ddd0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
2dde0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
2ddf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2de00 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
2de10 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
2de20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2de30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2de40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de50 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2de60 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2de70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2de80 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2de90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2dea0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2deb0 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
2dec0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2ded0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2dee0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2def0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2df00 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
2df10 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2df20 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
2df30 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
2df40 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
2df50 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
2df60 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
2df70 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
2df80 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
2df90 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2dfa0 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
2dfb0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
2dfc0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
2dfd0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
2dfe0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
2dff0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
2e000 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
2e010 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
2e020 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
2e030 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
2e040 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
2e050 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
2e060 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2e070 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
2e080 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
2e090 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
2e0a0 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
2e0b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
2e0c0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
2e0d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
2e0e0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
2e0f0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
2e100 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
2e110 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
2e120 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
2e130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e140 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
2e150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2e160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e180 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e190 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2e1a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2e1b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2e1c0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
2e1d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
2e1e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e1f0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
2e200 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
2e210 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
2e220 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
2e230 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
2e240 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
2e250 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
2e260 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
2e270 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
2e280 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
2e290 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2e2a0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
2e2b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2e2c0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
2e2d0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
2e2e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2e2f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
2e300 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
2e310 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
2e320 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
2e330 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
2e340 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e350 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
2e360 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2e370 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
2e380 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
2e390 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e3a0 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
2e3b0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
2e3c0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
2e3d0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
2e3e0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
2e3f0 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
2e400 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
2e410 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
2e420 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
2e430 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
2e440 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
2e450 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
2e460 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2e470 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
2e480 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
2e490 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
2e4a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
2e4b0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
2e4c0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
2e4d0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
2e4e0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
2e4f0 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
2e500 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
2e510 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
2e520 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
2e530 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
2e540 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
2e550 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
2e560 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2e570 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
2e580 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
2e590 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2e5a0 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
2e5b0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2e5c0 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
2e5d0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
2e5e0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
2e5f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2e600 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
2e610 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
2e620 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
2e630 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
2e640 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
2e650 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2e660 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2e670 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2e680 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
2e690 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
2e6a0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
2e6b0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
2e6c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2e6d0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
2e6e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
2e6f0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
2e700 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2e710 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2e720 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
2e730 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e750 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2e760 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e770 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2e780 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2e790 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
2e7a0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
2e7b0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2e7c0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
2e7d0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
2e7e0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
2e7f0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
2e800 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
2e810 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
2e820 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
2e830 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2e840 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
2e850 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
2e860 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
2e870 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2e880 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2e890 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e8a0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
2e8b0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2e8c0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2e8d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2e8e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2e8f0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
2e900 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2e910 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
2e920 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
2e930 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e940 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
2e950 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
2e960 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
2e970 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
2e980 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2e990 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
2e9a0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
2e9b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
2e9c0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
2e9d0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
2e9e0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
2e9f0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2ea00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ea10 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2ea20 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  k==0 || pPager->
2ea30 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20  readOnly );..   
2ea40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
2ea50 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  eadlock==0 ){.  
2ea60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2ea70 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2ea80 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2ea90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2eaa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2eac0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
2ead0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
2eae0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
2eaf0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CK );.        go
2eb00 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2eb10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2eb20 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
2eb30 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
2eb40 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
2eb50 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
2eb60 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2eb70 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
2eb80 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
2eb90 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
2eba0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2ebb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2ebc0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
2ebd0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
2ebe0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
2ebf0 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
2ec00 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
2ec10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ec20 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2ec30 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
2ec40 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
2ec50 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
2ec60 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
2ec70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2ec80 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
2ec90 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
2eca0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
2ecb0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
2ecc0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
2ecd0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
2ece0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2ecf0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2ed00 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
2ed10 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2ed20 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
2ed30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2ed40 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
2ed50 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
2ed60 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
2ed70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2ed80 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
2ed90 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
2eda0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
2edb0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
2edc0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
2edd0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
2ede0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
2edf0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
2ee00 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
2ee10 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
2ee20 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
2ee30 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
2ee40 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
2ee50 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
2ee60 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
2ee70 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
2ee80 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
2ee90 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
2eea0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
2eeb0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
2eec0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
2eed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2eee0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2eef0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2ef00 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
2ef10 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
2ef20 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
2ef30 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
2ef40 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
2ef50 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
2ef60 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2ef70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ef80 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
2ef90 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
2efa0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2efb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2efc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2efd0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2efe0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
2eff0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2f000 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
2f010 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
2f020 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
2f030 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2f040 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2f050 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
2f060 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
2f070 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
2f080 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
2f090 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
2f0a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2f0b0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
2f0c0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
2f0d0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
2f0e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
2f0f0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
2f100 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
2f110 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
2f120 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
2f130 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2f140 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
2f150 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
2f160 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
2f170 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
2f180 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
2f190 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
2f1a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2f1b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2f1c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f1d0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
2f1e0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
2f1f0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
2f200 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
2f210 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
2f220 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
2f230 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
2f240 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
2f250 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
2f260 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
2f270 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
2f280 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
2f290 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
2f2a0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
2f2b0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2f2c0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2f2d0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
2f2e0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
2f2f0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
2f300 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
2f310 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f320 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f330 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2f340 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2f350 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
2f360 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
2f370 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f380 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
2f390 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
2f3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2f3b0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
2f3c0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2f3d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2f3e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2f3f0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
2f400 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f410 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
2f420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2f430 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
2f440 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2f450 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2f460 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2f470 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2f480 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f490 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2f4a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2f4b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2f4c0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2f4d0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2f4e0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2f4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f500 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2f510 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2f520 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2f530 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f540 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2f550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f560 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2f570 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f580 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2f590 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f5a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2f5b0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2f5c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f5d0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2f5e0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2f5f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f600 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2f610 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2f620 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2f630 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2f640 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2f650 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2f660 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2f670 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2f680 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2f690 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2f6a0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2f6b0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2f6c0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2f6d0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2f6e0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2f6f0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2f700 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2f710 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2f720 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2f730 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2f740 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2f750 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2f760 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2f770 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2f780 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2f790 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2f7a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f7b0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2f7c0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f7d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2f7e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2f7f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2f800 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2f810 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2f820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f830 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2f840 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f850 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2f860 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2f870 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2f880 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2f890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2f8a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f8b0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2f8c0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2f8d0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2f8e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f8f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2f910 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2f920 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2f930 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f940 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2f950 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2f960 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2f970 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2f980 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2f990 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2f9a0 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2f9b0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2f9c0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2f9d0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2f9e0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2f9f0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2fa00 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2fa10 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2fa20 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2fa30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2fa40 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2fa50 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2fa60 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2fa70 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2fa80 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2fa90 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2faa0 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2fab0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2fac0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2fad0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2fae0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2faf0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2fb00 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2fb10 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2fb20 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2fb30 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2fb40 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2fb50 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2fb60 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2fb70 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2fb80 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2fb90 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2fba0 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2fbb0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2fbc0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2fbd0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2fbe0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2fbf0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2fc00 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2fc10 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2fc20 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2fc30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2fc40 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2fc50 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2fc60 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2fc70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2fc80 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2fc90 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2fca0 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2fcb0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2fcc0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2fcd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fce0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2fcf0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2fd00 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2fd10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2fd20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2fd30 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2fd40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2fd50 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2fd60 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2fd70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2fd80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2fd90 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2fda0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2fdb0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2fdc0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2fdd0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2fde0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2fdf0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2fe00 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2fe10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2fe20 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2fe30 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2fe40 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2fe50 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2fe60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fe70 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2fe80 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2fe90 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2fea0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2feb0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2fec0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2fed0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2fee0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2fef0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2ff00 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2ff10 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
2ff20 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
2ff30 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
2ff40 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
2ff50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
2ff60 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
2ff70 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
2ff80 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
2ff90 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
2ffa0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
2ffb0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2ffc0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
2ffd0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
2ffe0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
2fff0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
30000 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
30010 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
30020 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
30030 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
30040 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
30050 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
30060 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
30070 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
30080 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
30090 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
300a0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
300b0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
300c0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
300d0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
300e0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
300f0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
30100 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
30110 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
30120 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
30130 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
30140 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
30150 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
30160 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
30170 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
30180 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
30190 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
301a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
301b0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
301c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
301d0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
301e0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
301f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
30200 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
30210 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
30220 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
30230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30240 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
30250 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
30260 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
30270 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
30280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
302a0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
302b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
302c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
302d0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
302e0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
302f0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
30300 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
30310 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
30320 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
30330 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
30340 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
30350 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
30360 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
30370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30380 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
30390 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
303a0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
303b0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
303c0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
303d0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
303e0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
303f0 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
30400 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
30410 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
30420 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
30430 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30440 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
30450 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
30460 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
30470 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
30480 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
30490 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
304a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
304b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
304c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
304d0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
304e0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
304f0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
30500 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
30510 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
30520 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
30530 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
30540 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
30550 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
30560 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
30570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30580 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
30590 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
305a0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
305b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
305c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
305d0 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
305e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
305f0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
30600 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
30610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
30620 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
30630 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
30640 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
30650 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
30660 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
30670 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
30680 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
30690 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
306a0 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
306b0 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
306c0 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
306d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
306e0 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
306f0 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
30700 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
30710 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
30720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30730 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
30740 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
30750 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
30760 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30770 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
30780 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30790 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
307a0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
307b0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
307c0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
307d0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
307e0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
307f0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
30800 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
30810 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
30820 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
30830 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
30840 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
30850 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
30860 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
30870 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
30880 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
30890 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
308a0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
308b0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
308c0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
308d0 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
308e0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
308f0 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
30900 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
30910 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
30920 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
30930 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30940 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
30950 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
30960 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
30970 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
30980 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
30990 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
309a0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
309b0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
309c0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
309d0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
309e0 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
309f0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
30a00 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
30a10 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
30a20 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
30a30 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
30a40 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
30a50 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
30a60 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
30a70 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
30a80 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
30a90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30aa0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
30ab0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
30ac0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
30ad0 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
30ae0 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
30af0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
30b00 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
30b10 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
30b20 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
30b30 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
30b40 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
30b50 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
30b60 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
30b70 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
30b80 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
30b90 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
30ba0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
30bb0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
30bc0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
30bd0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
30be0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
30bf0 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
30c00 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
30c10 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
30c20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
30c30 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
30c40 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
30c50 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
30c60 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
30c70 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
30c80 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
30c90 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
30ca0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
30cb0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
30cc0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
30cd0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
30ce0 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
30cf0 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
30d00 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
30d10 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
30d20 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
30d30 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
30d40 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
30d50 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
30d60 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
30d70 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
30d80 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
30d90 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
30da0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
30db0 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
30dc0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
30dd0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
30de0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
30df0 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
30e00 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
30e10 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
30e20 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
30e30 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30e40 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
30e50 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
30e60 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
30e70 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
30e80 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
30e90 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
30ea0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
30eb0 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
30ec0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
30ed0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
30ee0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
30ef0 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
30f00 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
30f10 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
30f20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30f30 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
30f40 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
30f50 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
30f60 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
30f70 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
30f80 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
30f90 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
30fa0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
30fb0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
30fc0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
30fd0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
30fe0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
30ff0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
31000 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
31010 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
31020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
31030 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
31040 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
31050 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
31060 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
31070 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
31080 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
31090 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
310a0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
310b0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
310c0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
310d0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
310e0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
310f0 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
31100 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
31110 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
31120 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
31130 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
31140 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
31150 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
31160 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
31170 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
31180 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
31190 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
311a0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
311b0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
311c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
311d0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
311e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
311f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
31200 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
31210 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
31220 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
31230 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
31240 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
31250 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
31260 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
31270 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31280 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
31290 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
312a0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
312b0 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
312c0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
312d0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
312e0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
312f0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
31300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
31310 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
31320 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
31330 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
31340 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  er) );..  if( pg
31350 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
31360 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31370 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
31380 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
31390 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
313a0 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
313b0 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
313c0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
313d0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
313e0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
313f0 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
31400 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
31410 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
31420 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
31430 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
31440 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
31450 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
31460 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
31470 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
31480 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
31490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
314a0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
314b0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
314c0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
314d0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
314e0 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
314f0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
31500 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
31510 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
31520 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31530 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
31540 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
31550 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
31560 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
31570 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
31580 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31590 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
315a0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
315b0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
315c0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
315d0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
315e0 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
315f0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
31600 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
31610 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
31620 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
31630 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31640 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
31650 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
31660 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
31670 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
31680 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
31690 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
316a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
316b0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
316c0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
316d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
316e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
316f0 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nHit++;.    retu
31700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
31710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
31720 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
31730 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
31740 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
31750 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
31760 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
31770 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67  ed.  */..    pPg
31780 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20   = *ppPage;.    
31790 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
317a0 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ager;..    /* Th
317b0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
317c0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
317d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
317e0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
317f0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65     ** number gre
31800 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
31810 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f  or the unused lo
31820 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72  cking-page, is r
31830 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
31840 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
31850 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
31860 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
31870 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
31880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31890 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
318a0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
318b0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
318c0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
318d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
318e0 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
318f0 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
31900 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
31910 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
31920 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
31930 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31940 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
31950 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
31960 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
31970 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
31980 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
31990 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
319a0 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
319b0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
319c0 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
319d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
319e0 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
319f0 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
31a00 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
31a10 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
31a20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
31a30 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
31a40 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
31a50 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
31a60 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
31a70 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
31a80 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
31a90 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
31aa0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
31ab0 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
31ac0 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
31ad0 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
31ae0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31af0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
31b00 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
31b10 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
31b20 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
31b30 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
31b40 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
31b50 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
31b60 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
31b70 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
31b80 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
31b90 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
31ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
31bb0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
31bc0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
31bd0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
31be0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
31bf0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
31c00 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
31c10 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
31c20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
31c30 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
31c40 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
31c50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
31c60 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
31c70 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
31c80 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
31c90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31ca0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
31cb0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
31cc0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
31cd0 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 20 20 72  nMiss++;.      r
31ce0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
31cf0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
31d00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31d10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
31d20 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
31d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31d40 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
31d50 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  hash(pPg);.  }..
31d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31d70 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
31d80 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
31d90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31da0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
31db0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31dc0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
31dd0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
31de0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
31df0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
31e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31e10 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
31e20 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
31e30 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
31e40 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
31e50 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
31e60 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
31e70 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
31e80 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
31e90 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
31ea0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
31eb0 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
31ec0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
31ed0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
31ee0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
31ef0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
31f00 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
31f10 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
31f20 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
31f30 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
31f40 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
31f50 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
31f60 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
31f70 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
31f80 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
31f90 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
31fa0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
31fb0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
31fc0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
31fd0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
31fe0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
31ff0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
32000 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
32010 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
32020 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
32030 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
32040 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
32050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
32060 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
32070 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
32080 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
32090 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
320a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
320b0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
320c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
320d0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
320e0 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
320f0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
32100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
32110 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
32120 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
32130 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
32140 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
32150 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
32160 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
32170 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
32180 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
32190 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
321a0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
321b0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
321c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
321d0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
321e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
321f0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
32200 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
32210 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
32220 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
32230 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
32240 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
32250 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
32260 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
32270 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
32280 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
32290 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
322a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
322b0 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
322c0 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
322d0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
322e0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
322f0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
32300 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
32310 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
32320 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
32330 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
32340 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
32350 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
32360 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
32370 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
32380 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
32390 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
323a0 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
323b0 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
323c0 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
323d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
323e0 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
323f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
32400 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
32410 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
32420 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
32430 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
32440 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
32450 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
32460 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
32470 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
32480 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
32490 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
324a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
324b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
324c0 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
324d0 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
324e0 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
324f0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
32500 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
32510 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
32520 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
32530 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
32540 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
32550 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
32560 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32570 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
32580 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
32590 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
325a0 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
325b0 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
325c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
325d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
325e0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
325f0 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
32600 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
32610 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
32620 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
32630 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
32640 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
32650 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
32660 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
32670 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
32680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
32690 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
326a0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
326b0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
326c0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
326d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
326e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
32700 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
32710 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
32720 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
32730 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
32740 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
32750 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
32760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32770 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
32780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
32790 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
327a0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
327b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
327c0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
327d0 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
327e0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
327f0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
32800 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
32810 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
32820 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
32830 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
32840 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
32850 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
32860 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
32870 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
32880 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
32890 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
328a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
328b0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
328c0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
328d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
328e0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
328f0 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
32900 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32910 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
32920 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
32930 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
32940 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
32950 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
32960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
32970 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MEM;.    }.  .  
32980 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
32990 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
329a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
329b0 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
329c0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
329d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
329e0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
329f0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
32a00 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
32a10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
32a20 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
32a30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
32a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32a50 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
32a60 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
32a70 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
32a80 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
32a90 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
32aa0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
32ab0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
32ac0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
32ad0 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61  |.          (pPa
32ae0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
32af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
32b00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
32b10 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
32b20 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
32b30 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ):.            (
32b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
32b50 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
32b60 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20      );.  #ifdef 
32b70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
32b80 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
32b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
32ba0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
32bb0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
32bc0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
32bd0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
32be0 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
32bf0 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
32c00 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20     );.  #else.  
32c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32c20 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
32c30 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
32c40 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
32c50 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ags, 0);.  #endi
32c60 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
32c70 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
32c80 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
32c90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
32ca0 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
32cb0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
32cc0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
32cd0 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
32ce0 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
32cf0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
32d00 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
32d10 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
32d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32d30 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
32d40 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
32d50 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
32d60 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
32d70 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
32d80 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
32d90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
32da0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
32db0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
32dc0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
32dd0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
32de0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
32df0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
32e00 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
32e10 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
32e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
32e30 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
32e40 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
32e50 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
32e60 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
32e70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
32e80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32e90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
32ea0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
32eb0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32ec0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
32ed0 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
32ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32ef0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
32f00 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
32f10 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
32f20 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
32f30 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
32f40 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
32f50 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
32f60 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
32f70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
32f80 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
32f90 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
32fa0 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
32fb0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
32fc0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
32fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32fe0 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
32ff0 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
33000 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
33010 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
33020 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
33030 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
33040 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
33050 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
33060 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
33070 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
33080 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
33090 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
330a0 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
330b0 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
330c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
330d0 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
330e0 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
330f0 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
33100 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
33110 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
33120 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
33130 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
33140 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
33150 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
33160 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
33170 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
33180 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
33190 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
331a0 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
331b0 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
331c0 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
331d0 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
331e0 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
331f0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
33200 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
33210 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
33220 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
33230 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
33240 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
33250 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
33260 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
33270 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
33280 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
33290 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
332a0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
332b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
332c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
332d0 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  rCode;.  assert(
332e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
332f0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
33300 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
33310 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
33320 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
33330 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
33340 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
33350 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
33360 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
33370 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73  ADER) ){.    ass
33380 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
33390 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20  Journal==0 );.. 
333a0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
333b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
333c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
333d0 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
333e0 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
333f0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
33400 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
33410 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
33420 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
33430 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
33440 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
33450 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
33460 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
33470 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
33480 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
33490 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
334a0 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
334b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
334c0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
334d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
334e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
334f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33500 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
33510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33520 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
33530 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
33540 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
33550 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
33560 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
33570 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
33580 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
33590 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
335a0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
335b0 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
335c0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
335d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
335e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
335f0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
33600 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
33610 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
33620 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
33630 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
33640 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
33650 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
33660 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
33670 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
33680 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
33690 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
336a0 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
336b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
336c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
336d0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
336e0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
336f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33700 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
33710 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
33720 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
33730 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
33740 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
33750 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
33760 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
33770 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
33780 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
33790 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
337a0 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
337b0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
337c0 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
337d0 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
337e0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
337f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33800 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
33810 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
33820 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33830 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
33840 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33850 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
33860 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
33870 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
33880 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
338a0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
338b0 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
338c0 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
338d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
338e0 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
338f0 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
33900 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33910 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
33920 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
33930 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
33940 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
33950 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
33960 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
33970 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
33980 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
33990 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
339a0 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
339b0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
339c0 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
339d0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
339e0 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
339f0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
33a00 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
33a10 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
33a20 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
33a30 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
33a40 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
33a50 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
33a60 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
33a70 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33a80 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
33a90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
33aa0 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
33ab0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
33ac0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
33ad0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
33ae0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
33af0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
33b00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
33b10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
33b20 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
33b30 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
33b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33b50 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
33b60 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
33b70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
33b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
33b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33ba0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
33bb0 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
33bc0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
33bd0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
33be0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
33bf0 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
33c00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
33c10 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
33c20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33c30 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
33c40 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
33c50 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
33c60 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
33c70 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
33c80 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
33c90 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
33ca0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
33cb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
33cc0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
33cd0 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
33ce0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
33cf0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
33d00 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
33d10 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
33d20 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
33d30 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
33d40 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
33d50 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
33d60 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
33d70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
33d80 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
33d90 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
33da0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
33db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
33dc0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
33dd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33de0 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
33df0 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
33e00 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
33e10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
33e20 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
33e30 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
33e40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33e50 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
33e60 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
33e70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
33e80 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
33e90 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
33ea0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
33eb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33ec0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
33ed0 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
33ee0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33ef0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
33f00 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
33f10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33f20 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
33f30 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
33f40 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33f50 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
33f60 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
33f70 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f   has been previo
33f80 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72  usly detected, r
33f90 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65  eport the same e
33fa0 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  rror.  ** again.
33fb0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
33fc0 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74 68 65   happen, but the
33fd0 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65 73 20   check provides 
33fe0 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20  robustness. */. 
33ff0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
34000 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72  r->errCode) )  r
34010 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
34020 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
34030 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
34040 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
34050 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
34060 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
34070 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
34080 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
34090 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
340a0 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
340b0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
340c0 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
340d0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
340e0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
340f0 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
34100 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
34110 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68   be opened. High
34120 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
34130 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  s have already. 
34140 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65   ** obtained the
34150 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
34160 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72   to begin the wr
34170 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
34180 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f   but the.  ** ro
34190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
341a0 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20  ight not yet be 
341b0 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f  open. Open it no
341c0 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  w if this is the
341d0 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
341e0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
341f0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fore calling sql
34200 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
34210 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67  rty() on the pag
34220 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
34230 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64  se, if it were d
34240 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e  one after callin
34250 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
34260 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e  akeDirty(), then
34270 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d  .  ** an error m
34280 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74  ight occur and t
34290 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65  he pager would e
342a0 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f  nd up in WRITER_
342b0 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a  LOCKED state.  *
342c0 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72  * with pages mar
342d0 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20  ked as dirty in 
342e0 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  the cache..  */.
342f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
34300 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34310 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
34320 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
34330 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
34340 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34350 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
34360 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
34370 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
34380 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
34390 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73  CACHEMOD );.  as
343a0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
343b0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
343c0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74   );..  /* Mark t
343d0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
343e0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
343f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
34400 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
34410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
34420 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
34430 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
34440 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
34450 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
34460 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
34470 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
34480 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
34490 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
344a0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
344b0 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65  ager) );.  }else
344c0 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  {.  .    /* The 
344d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
344e0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
344f0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
34500 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
34510 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
34520 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
34530 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
34540 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
34550 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
34560 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
34570 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
34580 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
34590 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
345a0 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  ( !pageInJournal
345b0 28 70 50 67 29 20 26 26 20 21 70 61 67 65 72 55  (pPg) && !pagerU
345c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
345d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
345e0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
345f0 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  r)==0 );.      i
34600 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
34610 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
34620 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
34630 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
34640 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
34650 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
34660 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  a2;.        i64 
34670 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
34680 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20  ournalOff;..    
34690 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
346a0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
346b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
346c0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
346d0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
346e0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
346f0 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
34700 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
34710 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
34720 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
34730 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
34740 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
34750 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34760 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ger) );..       
34770 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34780 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61  >journalHdr<=pPa
34790 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
347a0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
347b0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
347c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
347d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
347e0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
347f0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
34800 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
34810 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
34820 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
34830 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
34840 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
34850 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  s while journall
34860 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
34870 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
34880 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
34890 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
348a0 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
348b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
348c0 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
348d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
348e0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
348f0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
34900 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
34910 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
34920 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
34930 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
34940 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
34950 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
34960 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
34970 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
34980 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
34990 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
349a0 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
349b0 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
349c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  */.        pPg->
349d0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
349e0 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20  EED_SYNC;..     
349f0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
34a00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
34a10 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   iOff, pPg->pgno
34a20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
34a40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
34a60 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
34a70 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
34a80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
34a90 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  f+4);.        if
34aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34ab0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34ac0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
34ad0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
34ae0 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e  d, iOff+pPager->
34af0 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75  pageSize+4, cksu
34b00 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
34b10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34b20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
34b30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
34b40 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
34b50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
34b60 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
34b70 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
34b80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
34b90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
34ba0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
34bb0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
34bc0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
34bd0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
34be0 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
34bf0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
34c00 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
34c10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34c20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
34c30 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
34c40 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
34c50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
34c60 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
34c70 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
34c80 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  Pg)));..        
34c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
34ca0 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72  ff += 8 + pPager
34cb0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
34cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
34cd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
34ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
34cf0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
34d00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34d10 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
34d20 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
34d30 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
34d40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
34d50 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
34d60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
34d80 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
34d90 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EM );.        rc
34da0 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
34db0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
34dc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
34dd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34df0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
34e00 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
34e10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
34e20 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
34e30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34e40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
34e50 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
34e60 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20  RITER_DBMOD ){. 
34e70 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
34e80 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
34e90 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
34ea0 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
34eb0 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
34ec0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
34ed0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
34ee0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
34ef0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
34f00 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
34f10 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
34f20 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
34f30 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
34f40 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
34f50 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
34f60 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
34f70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
34f80 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
34f90 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
34fa0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
34fb0 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
34fc0 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
34fd0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
34fe0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34ff0 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
35000 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
35010 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
35020 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
35030 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
35040 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
35050 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
35060 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
35070 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
35080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
35090 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
350a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
350b0 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
350c0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
350d0 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
350e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
350f0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
35100 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
35110 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
35120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35130 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
35140 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
35150 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69  able. This routi
35160 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
35170 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b  d before .** mak
35180 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ing changes to a
35190 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65   page. The calle
351a0 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  r must check the
351b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a   return value .*
351c0 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  * of this functi
351d0 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  on and be carefu
351e0 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20  l not to change 
351f0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
35200 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f  less .** this ro
35210 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
35220 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
35230 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
35240 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
35250 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
35260 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
35270 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
35280 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
35290 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
352a0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
352b0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
352c0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
352d0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
352e0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
352f0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
35300 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
35310 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
35320 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
35330 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
35340 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
35350 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
35360 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
35370 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
35380 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ** as appropriat
35390 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
353a0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
353b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
353c0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
353d0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
353e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
353f0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
35400 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
35410 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
35420 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
35430 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
35440 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
35450 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
35460 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
35470 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
35480 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
35490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
354a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
354b0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
354c0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
354d0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
354e0 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65   );..  if( nPage
354f0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
35500 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
35510 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
35520 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
35530 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
35540 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
35550 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
35560 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
35570 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
35580 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
35590 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
355a0 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
355b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
355c0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
355d0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
355e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
355f0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
35600 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
35610 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
35620 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
35630 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
35640 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
35650 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
35660 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
35670 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
35680 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  l flag to 1. Thi
35690 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
356a0 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20  cannot allow.   
356b0 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65   ** a journal he
356c0 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
356d0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
356e0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
356f0 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75  y.    ** this fu
35700 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
35710 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
35720 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
35730 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
35740 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ncSpill==0 );.  
35750 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
35760 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20  yncSpill++;..   
35770 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
35780 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
35790 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
357a0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
357b0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
357c0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
357d0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
357e0 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
357f0 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
35800 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
35810 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
35820 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
35830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
35840 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
35850 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
35860 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
35870 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20     nPageCount = 
35880 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
35890 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
358a0 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
358b0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
358c0 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
358d0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
358e0 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
358f0 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
35900 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
35910 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
35920 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
35930 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
35940 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
35950 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
35960 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
35970 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
35980 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
35990 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
359a0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
359b0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
359c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
359d0 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
359e0 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
359f0 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
35a00 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
35a10 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
35a20 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
35a30 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
35a40 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
35a50 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
35a60 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
35a70 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
35a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35a90 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
35aa0 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
35ab0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35ad0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
35ae0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
35af0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
35b00 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
35b10 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
35b30 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
35b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
35b60 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
35b70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35b80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
35b90 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
35ba0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
35bb0 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
35bc0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
35bd0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
35be0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
35bf0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
35c00 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
35c10 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
35c20 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
35c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
35c40 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44    /* If the PGHD
35c50 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
35c60 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
35c70 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
35c80 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
35c90 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
35ca0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
35cb0 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
35cc0 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
35cd0 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
35ce0 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
35cf0 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
35d00 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
35d10 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
35d20 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
35d30 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
35d40 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
35d50 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
35d60 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
35d70 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
35d80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
35d90 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
35da0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35db0 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29  OK && needSync )
35dc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
35dd0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
35de0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
35df0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
35e00 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
35e10 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
35e20 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
35e30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
35e40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
35e50 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
35e60 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
35e70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35e80 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35e90 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
35ea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
35eb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35ec0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
35ed0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
35ee0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
35ef0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
35f00 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
35f10 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
35f20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35f30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
35f40 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
35f50 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
35f60 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
35f70 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
35f80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35f90 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
35fa0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
35fb0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
35fc0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
35fd0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
35fe0 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
35ff0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
36000 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36010 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
36020 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c    return pPg->fl
36030 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b  ags&PGHDR_DIRTY;
36040 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
36050 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
36060 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
36070 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
36080 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
36090 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
360a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
360b0 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
360c0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
360d0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
360e0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
360f0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54  ked as dirty.  T
36100 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
36110 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a   example, when.*
36120 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  * the page has b
36130 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c  een added as a l
36140 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  eaf of the freel
36150 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a  ist and so its.*
36160 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e  * content no lon
36170 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a  ger matters..**.
36180 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
36190 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
361a0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
361b0 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
361c0 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
361d0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
361e0 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65  unused. The page
361f0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
36200 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
36210 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
36220 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
36230 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
36240 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
36250 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
36260 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  n quadruple the 
36270 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a  speed of large .
36280 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  ** DELETE operat
36290 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ions..*/.void sq
362a0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
362b0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
362c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
362d0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
362e0 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
362f0 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26  s&PGHDR_DIRTY) &
36300 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
36310 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50  oint==0 ){.    P
36320 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54  AGERTRACE(("DONT
36330 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
36340 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
36350 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
36360 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  er)));.    IOTRA
36370 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
36380 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
36390 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67  ->pgno)).    pPg
363a0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
363b0 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20  _DONT_WRITE;.   
363c0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
363d0 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ash(pPg);.  }.}.
363e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
363f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
36400 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
36410 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
36420 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
36430 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
36440 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
36450 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
36460 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
36470 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
36480 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
36490 66 69 6c 65 2e 20 20 54 68 65 20 73 65 63 6f 6e  file.  The secon
364a0 64 61 72 79 20 63 68 61 6e 67 65 20 63 6f 75 6e  dary change coun
364b0 74 65 72 20 61 74 0a 2a 2a 20 39 32 20 69 73 20  ter at.** 92 is 
364c0 61 6c 73 6f 20 75 70 64 61 74 65 64 2c 20 61 73  also updated, as
364d0 20 69 73 20 74 68 65 20 53 51 4c 69 74 65 20 76   is the SQLite v
364e0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
364f0 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
36500 2a 20 42 75 74 20 74 68 69 73 20 6f 6e 6c 79 20  * But this only 
36510 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 70  happens if the p
36520 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
36530 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 66  ntDone flag is f
36540 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69  alse..** To avoi
36550 64 20 65 78 63 65 73 73 20 63 68 75 72 6e 69 6e  d excess churnin
36560 67 20 6f 66 20 70 61 67 65 20 31 2c 20 74 68 65  g of page 1, the
36570 20 75 70 64 61 74 65 20 6f 6e 6c 79 20 68 61 70   update only hap
36580 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65  pens once..** Se
36590 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72  e also the pager
365a0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
365b0 6e 74 65 72 28 29 20 72 6f 75 74 69 6e 65 20 74  nter() routine t
365c0 68 61 74 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20  hat does an .** 
365d0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
365e0 64 61 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e  date of the chan
365f0 67 65 20 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a  ge counters..**.
36600 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
36610 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a  ctMode flag is z
36620 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ero, then this i
36630 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  s done by callin
36640 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
36650 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67  erWrite() on pag
36660 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e 1, then modify
36670 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
36680 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
36690 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61  data. In this ca
366a0 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  se the file will
366b0 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e   be updated when
366c0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
366d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
366e0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
366f0 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  The isDirectMode
36700 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62   flag may only b
36710 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  e non-zero if th
36720 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
36730 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74  mpiled.** with t
36740 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
36750 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61  _ATOMIC_WRITE ma
36760 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20  cro defined. In 
36770 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66  this case,.** if
36780 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e   isDirect is non
36790 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
367a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
367b0 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c   updated directl
367c0 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20  y.** by writing 
367d0 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69  an updated versi
367e0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69  on of page 1 usi
367f0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65  ng a call to the
36800 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72   .** sqlite3OsWr
36810 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ite() function..
36820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
36830 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
36840 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
36850 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65  ager, int isDire
36860 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72  ctMode){.  int r
36870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
36880 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36890 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
368a0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
368b0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
368c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
368d0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
368e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
368f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36900 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
36910 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
36920 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
36930 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
36940 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
36950 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
36960 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
36970 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
36980 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
36990 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
369a0 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
369b0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
369c0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
369d0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
369e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
369f0 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
36a00 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
36a10 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
36a20 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
36a30 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
36a40 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
36a50 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
36a60 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
36a70 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
36a80 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
36a90 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
36aa0 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
36ab0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
36ac0 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
36ad0 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
36ae0 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
36af0 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
36b00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
36b10 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64  ATOMIC_WRITE.# d
36b20 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
36b30 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69 73  E 0.  assert( is
36b40 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
36b50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36b60 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
36b70 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  );.#else.# defin
36b80 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73  e DIRECT_MODE is
36b90 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69  DirectMode.#endi
36ba0 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  f..  if( !pPager
36bb0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
36bc0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
36bd0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
36be0 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
36bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36c00 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
36c10 31 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  1 */..    assert
36c20 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
36c30 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ile && isOpen(pP
36c40 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
36c50 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
36c60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
36c70 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
36c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36c90 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
36ca0 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61   &pPgHdr);.    a
36cb0 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30  ssert( pPgHdr==0
36cc0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
36cd0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
36ce0 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74  page one was fet
36cf0 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ched successfull
36d00 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  y, and this func
36d10 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20  tion is not.    
36d20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  ** operating in 
36d30 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b  direct-mode, mak
36d40 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c  e page 1 writabl
36d50 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20  e.  When not in 
36d60 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d  .    ** direct m
36d70 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61  ode, page 1 is a
36d80 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61  lways held in ca
36d90 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68  che and hence th
36da0 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20  e PagerGet().   
36db0 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77   ** above is alw
36dc0 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d  ays successful -
36dd0 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59   hence the ALWAY
36de0 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f  S on rc==SQLITE_
36df0 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OK..    */.    i
36e00 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20  f( !DIRECT_MODE 
36e10 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51  && ALWAYS(rc==SQ
36e20 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
36e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36e40 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
36e50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
36e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36e70 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61  {.      /* Actua
36e80 6c 6c 79 20 64 6f 20 74 68 65 20 75 70 64 61 74  lly do the updat
36e90 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20  e of the change 
36ea0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
36eb0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
36ec0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 67 48 64  ngecounter(pPgHd
36ed0 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  r);..      /* If
36ee0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65   running in dire
36ef0 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74  ct mode, write t
36f00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
36f10 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c  age 1 to the fil
36f20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
36f30 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20  DIRECT_MODE ){. 
36f40 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
36f50 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20  d *zBuf;.       
36f60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36f70 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b  >dbFileSize>0 );
36f80 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
36f90 70 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e  pPager, pPgHdr->
36fa0 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d  pData, 1, 6, rc=
36fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42  SQLITE_NOMEM, zB
36fc0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  uf);.        if(
36fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
36ff0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
37000 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
37010 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
37020 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
37030 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
37040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37050 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
37060 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
37070 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
37080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37090 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
370a0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
370b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
370c0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
370d0 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
370e0 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
370f0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
37100 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
37110 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37120 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
37130 65 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  e file to disk. 
37140 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
37150 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
37160 74 61 62 61 73 65 73 0a 2a 2a 20 6f 72 20 70 61  tabases.** or pa
37170 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
37180 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
37190 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
371a0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 63  cessful, or if c
371b0 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72  alled on a pager
371c0 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73   for which it is
371d0 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a   a no-op, this.*
371e0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
371f0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  ns SQLITE_OK. Ot
37200 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65  herwise, an IO e
37210 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
37220 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
37230 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
37240 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
37250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37260 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
37270 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
37280 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
37290 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
372a0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
372b0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
372c0 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d 65 6c  yncFlags);.  }el
372d0 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  se if( isOpen(pP
372e0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
372f0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
37300 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
37310 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
37320 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
37330 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f  ITE_FCNTL_SYNC_O
37340 4d 49 54 54 45 44 2c 20 30 29 3b 0a 20 20 20 20  MITTED, 0);.    
37350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
37360 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
37370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
37390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
373a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
373b0 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
373c0 64 20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d  d while a write-
373d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
373e0 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c  ctive in.** roll
373f0 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e  back. If the con
37400 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
37410 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c  L mode, this cal
37420 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a  l is a no-op. .*
37430 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
37440 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  the connection d
37450 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
37460 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56  have an EXCLUSIV
37470 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  E lock on .** th
37480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
37490 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
374a0 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e  ade to obtain on
374b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
374c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
374d0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f  s already held o
374e0 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
374f0 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a   obtain it is.**
37500 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
37510 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
37520 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53  s in WAL mode, S
37530 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
37540 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
37550 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  se, either SQLIT
37560 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c  E_BUSY or an SQL
37570 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
37580 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
37590 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
375a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
375b0 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72  lusiveLock(Pager
375c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
375d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
375e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
375f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37600 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37610 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
37620 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37630 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a  R_WRITER_DBMOD .
37640 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37650 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37660 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20  WRITER_LOCKED . 
37670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37680 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37690 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66  (pPager) );.  if
376a0 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c  ( 0==pagerUseWal
376b0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
376c0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
376d0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
376e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
376f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
37710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37720 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
37730 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
37740 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
37750 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
37760 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
37770 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
37780 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
37790 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
377a0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
377b0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
377c0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
377d0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
377e0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
377f0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
37800 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
37810 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37820 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
37830 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
37840 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
37850 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
37860 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
37870 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
37880 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
37890 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
378a0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
378b0 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
378c0 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
378d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
378e0 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
378f0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
37900 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
37910 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
37920 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
37930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
37940 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
37950 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
37960 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
37970 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
37980 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
37990 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
379a0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
379b0 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
379c0 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
379d0 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
379e0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
379f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
37a00 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
37a10 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
37a20 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
37a30 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
37a40 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
37a50 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
37a60 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
37a70 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
37a80 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
37a90 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
37aa0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
37ab0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
37ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37ad0 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
37ae0 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
37af0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
37b00 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
37b10 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
37b20 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
37b30 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
37b40 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
37b50 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
37b60 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
37b70 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
37b80 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
37b90 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
37ba0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
37bb0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
37bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
37bd0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
37be0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
37bf0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
37c00 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
37c10 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
37c20 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
37c30 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
37c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
37c50 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
37c60 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
37c70 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
37c80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
37c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
37ca0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
37cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37cc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37cd0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
37ce0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37cf0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37d00 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
37d10 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37d20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37d30 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
37d40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37d50 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
37d60 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
37d70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37d80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
37d90 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72  /* If a prior er
37da0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65  ror occurred, re
37db0 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20  port that error 
37dc0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  again. */.  if( 
37dd0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
37de0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
37df0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
37e00 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
37e10 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
37e20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
37e30 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
37e40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
37e50 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
37e60 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
37e70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  e));..  /* If no
37e80 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
37e90 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  s have been made
37ea0 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
37eb0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
37ec0 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
37ed0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20  ITER_CACHEMOD ) 
37ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37ef0 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
37f00 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
37f10 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
37f20 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
37f30 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
37f40 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
37f50 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
37f60 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
37f70 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
37f80 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
37f90 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
37fa0 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
37fb0 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
37fc0 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
37fd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
37fe0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
37ff0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
38000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
38010 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
38020 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48  er) ){.      PgH
38030 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
38040 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
38050 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
38060 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48 64 72  he);.      PgHdr
38070 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30 3b 0a   *pPageOne = 0;.
38080 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
38090 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
380a0 20 4d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65   Must have at le
380b0 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66 6f 72  ast one page for
380c0 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69 74 20   the WAL commit 
380d0 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a  flag..        **
380e0 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35 63 36   Ticket [2d1a5c6
380f0 37 64 66 63 32 33 36 33 65 34 34 66 32 39 64 39  7dfc2363e44f29d9
38100 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30 35 2d  bbd57f] 2011-05-
38110 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  18 */.        rc
38120 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
38130 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
38140 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20  PageOne);.      
38150 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67 65 4f    pList = pPageO
38160 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  ne;.        pLis
38170 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  t->pDirty = 0;. 
38180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
38190 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
381a0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
381b0 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
381c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
381d0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
381e0 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67  ger, pList, pPag
381f0 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 29 3b 0a  er->dbSize, 1);.
38200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
38210 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
38220 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20  pPageOne);.     
38230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
38250 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
38260 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
38270 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  che);.      }.  
38280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
38290 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
382a0 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
382b0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
382c0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
382d0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  .      ** does t
382e0 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
382f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
38300 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
38310 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
38320 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
38330 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
38340 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
38350 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
38360 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72   the .      ** r
38370 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
38380 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
38390 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a  tion: .      **.
383a0 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
383b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
383c0 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
383d0 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
383e0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20   for.      **   
383f0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
38400 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
38410 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20   .      **    * 
38420 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
38430 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
38440 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
38450 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ion, and.      *
38460 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
38470 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
38480 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
38490 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
384a0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
384b0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
384c0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
384d0 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
384e0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
384f0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  then the.      *
38500 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
38510 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
38520 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
38530 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
38540 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ange.      ** co
38550 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
38560 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
38570 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
38580 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
38590 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
385a0 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
385b0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
385c0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
385d0 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
385e0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75     ** to make su
385f0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
38600 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ile has actually
38610 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74   been created, t
38620 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a  hen call.      *
38630 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
38640 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
38650 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
38660 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64  e-counter in ind
38670 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d  irect.      ** m
38680 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ode. .      **. 
38690 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
386a0 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
386b0 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
386c0 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
386d0 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20  cable,.      ** 
386e0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
38