/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact afcd1f6f707f3bff2e214f326fcdcdebe1ef8203:


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 2a 0a 2a 2a 20 20  b-codes..**.**  
6fa0: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
6fb0: 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
6fc0: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6fd0: 6f 66 20 69 74 73 20 73 75 62 63 6f 64 65 73 2c  of its subcodes,
6fe0: 20 74 68 65 6e 0a 2a 2a 20 20 20 74 68 69 73 20   then.**   this 
6ff0: 76 61 6c 75 65 20 69 73 20 69 6d 6d 65 64 69 61  value is immedia
7000: 74 65 6c 79 20 72 65 74 75 72 6e 65 64 20 77 68  tely returned wh
7010: 65 6e 20 65 76 65 72 20 61 6e 79 20 73 71 6c 69  en ever any sqli
7020: 74 65 33 50 61 67 65 72 58 58 58 28 29 20 6d 65  te3PagerXXX() me
7030: 74 68 6f 64 0a 2a 2a 20 20 20 74 68 61 74 20 72  thod.**   that r
7040: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
7050: 63 6f 64 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  code is called. 
7060: 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  If it is set to 
7070: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 0a 2a 2a 20  SQLITE_FULL,.** 
7080: 20 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74    then it is ret
7090: 75 72 6e 65 64 20 77 68 65 6e 65 76 65 72 20 61  urned whenever a
70a0: 6e 79 20 73 75 63 68 20 73 71 6c 69 74 65 33 50  ny such sqlite3P
70b0: 61 67 65 72 58 58 58 28 29 20 6d 65 74 68 6f 64  agerXXX() method
70c0: 20 65 78 63 65 70 74 0a 2a 2a 20 20 20 66 6f 72   except.**   for
70d0: 20 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20   PagerAcquire() 
70e0: 6f 72 20 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  or PagerLookup()
70f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7100: 2a 20 20 20 54 4f 44 4f 3a 20 52 65 76 69 65 77  *   TODO: Review
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c   the SQLITE_FULL
7120: 2f 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  /PagerAcquire() 
7130: 65 78 63 65 70 74 69 6f 6e 2e 20 49 73 20 69 74  exception. Is it
7140: 20 61 20 67 6f 6f 64 20 69 64 65 61 3f 0a 2a 2a   a good idea?.**
7150: 20 20 20 20 20 20 20 20 20 49 66 20 73 6f 2c 20           If so, 
7160: 61 72 65 20 74 68 65 72 65 20 62 75 67 73 20 77  are there bugs w
7170: 68 65 72 65 62 79 20 73 68 61 72 65 64 2d 63 61  hereby shared-ca
7180: 63 68 65 20 63 6c 69 65 6e 74 73 20 63 61 6e 20  che clients can 
7190: 73 65 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  see .**         
71a0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 64 61 74 61  uncommitted data
71b0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
71c0: 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  is in the ERROR 
71d0: 73 74 61 74 65 3f 0a 2a 2a 0a 2a 2f 0a 73 74 72  state?.**.*/.str
71e0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
71f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
7200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
7210: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
7220: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
7230: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
7240: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
7250: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
7260: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
7270: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
7280: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
7290: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
72a0: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
72b0: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
72c0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
72d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
72e0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
72f0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
7300: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
7310: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
7320: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7330: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
7340: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
7350: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7370: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
7380: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
7390: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
73a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
73b0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
73c0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
73d0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
73e0: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
73f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7400: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
7410: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7420: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65  _FULL */.  u8 te
7430: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7440: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7450: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7460: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7470: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7490: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
74a0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
74b0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
74c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
74d0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
74e0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
74f0: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7540: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7550: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7560: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7570: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7580: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
7590: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
75a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
75b0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
75c0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
75d0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
75e0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
75f0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7600: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7610: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7620: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7630: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7640: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7650: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7660: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7670: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7680: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7690: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
76a0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
76b0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
76c0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
76d0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
76e0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
76f0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7700: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7710: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7720: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7740: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7750: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7760: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7770: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7790: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
77a0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
77b0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
77c0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
77d0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
77e0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
77f0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7800: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7810: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7820: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7830: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7840: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7850: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7860: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7870: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7880: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7890: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
78a0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
78b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
78c0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
78d0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
78e0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
78f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7900: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7910: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7920: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7930: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7960: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7970: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7980: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
7990: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
79a0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
79b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
79c0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
79d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79e0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
79f0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7a00: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7a10: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7a20: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7a30: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7a40: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7a50: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a70: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7a80: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7a90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7ac0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
7ad0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
7ae0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7af0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7b00: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7b10: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7b20: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7b30: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7b40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7b50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7b60: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7b70: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7b80: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7b90: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7ba0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7bb0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7bd0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7be0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7bf0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7c00: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7c10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7c20: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7c30: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7c40: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7c50: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7c60: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7c70: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c80: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7c90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ca0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7cb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7cc0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7cd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7ce0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7cf0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7d00: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7d10: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7d20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7d30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7d40: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7d50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7d60: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7d70: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7d80: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7d90: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7da0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7db0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7dc0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7dd0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7de0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7df0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7e00: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7e10: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7e20: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7e30: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7e40: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7e50: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7e60: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7e70: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7e80: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ed0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7ee0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7ef0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7f00: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7f10: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7f20: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7f30: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7f40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f50: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7f60: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7f70: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7f80: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7f90: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7fa0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7fb0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7fc0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7fd0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7fe0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7ff0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8000: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8020: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8030: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8040: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8070: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
8080: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
8090: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
80a0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
80b0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
80c0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
80d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
80e0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
80f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8100: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8110: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8120: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8130: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8150: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8160: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8170: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
8180: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
8190: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
81a0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
81b0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
81c0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
81d0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
81e0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
81f0: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
8200: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
8210: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
8220: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
8230: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
8240: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8250: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
8260: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8270: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8280: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8290: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
82a0: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
82b0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
82c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
82d0: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
82e0: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
82f0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
8300: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
8310: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28  data */.  void (
8320: 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29  *xCodecSizeChng)
8330: 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b  (void*,int,int);
8340: 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61   /* Notify of pa
8350: 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  ge size changes 
8360: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8370: 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20  ecFree)(void*); 
8380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8390: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
83a0: 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69  e codec */.  voi
83b0: 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20  d *pCodec;      
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
83d0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
83e0: 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20  odec... methods 
83f0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
8400: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
8410: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
8420: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
8430: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
8440: 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65   use */.  PCache
8450: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
8460: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8470: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
8480: 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66  bject */.#ifndef
8490: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
84a0: 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20  .  Wal *pWal;   
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84c0: 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  * Write-ahead lo
84d0: 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e  g used by "journ
84e0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a  al_mode=wal" */.
84f0: 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20    char *zWal;   
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8510: 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77   File name for w
8520: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a  rite-ahead log *
8530: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8540: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8550: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8560: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8570: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8580: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8590: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
85a0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
85b0: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
85c0: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
85d0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
85e0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
85f0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8600: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8610: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8620: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8630: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8640: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8650: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8660: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8670: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8680: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8690: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
86a0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
86b0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
86c0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
86d0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
86e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
86f0: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8700: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8710: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8720: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8730: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8740: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8750: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8760: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8770: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8780: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8790: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
87a0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
87b0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
87c0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
87d0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
87e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
87f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8800: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8810: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8820: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8830: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8840: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8850: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8860: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8870: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8880: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8890: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
88a0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
88b0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
88c0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
88d0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
88e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
88f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8900: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8910: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8920: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8930: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8940: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8950: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8960: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8970: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8990: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
89a0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
89b0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
89c0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
89d0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
89e0: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
89f0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8a00: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8a10: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8a20: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8a30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8a40: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8a50: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8a60: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8a70: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
8a80: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
8a90: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
8aa0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8ab0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
8ac0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
8ad0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
8ae0: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
8af0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
8b00: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
8b10: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
8b20: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
8b30: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
8b40: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
8b50: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
8b60: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
8b70: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
8b80: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
8b90: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
8ba0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
8bb0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
8bc0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
8bd0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
8be0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
8bf0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
8c00: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
8c10: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
8c20: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
8c30: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
8c40: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
8c50: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
8c60: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
8c70: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
8c80: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
8c90: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
8ca0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
8cb0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
8cc0: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
8cd0: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
8ce0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8cf0: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
8d00: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
8d10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
8d20: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
8d30: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
8d40: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
8d50: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
8d60: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
8d70: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
8d80: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
8d90: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
8da0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
8db0: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
8dc0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
8dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8de0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
8df0: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
8e00: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
8e10: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
8e20: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
8e30: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
8e40: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
8e50: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
8e60: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
8e70: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
8e80: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8e90: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
8ea0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
8eb0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
8ec0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
8ed0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
8ee0: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
8ef0: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
8f00: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
8f10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
8f20: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
8f30: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
8f40: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
8f50: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
8f60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
8f70: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
8f80: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
8f90: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
8fa0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
8fb0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
8fc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
8fd0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
8fe0: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
8ff0: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
9000: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
9010: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9020: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
9030: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
9040: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
9050: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
9060: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
9070: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9090: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
90a0: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
90b0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
90c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
90d0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
90e0: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
90f0: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
9100: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
9110: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
9120: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
9130: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
9140: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
9150: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
9160: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
9170: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
9180: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9190: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69  E_OMIT_WAL.stati
91a0: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61  c int pagerUseWa
91b0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
91c0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
91d0: 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a  er->pWal!=0);.}.
91e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
91f0: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9200: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9210: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9220: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
9230: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a  Frames(v,w,x,y,z
9240: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9250: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9260: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9270: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9280: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9290: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
92a0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
92b0: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
92c0: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
92d0: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
92e0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
92f0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
9300: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
9310: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
9320: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
9330: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
9340: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9350: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9360: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9370: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9380: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9390: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
93a0: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
93b0: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
93c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
93d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
93e0: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
93f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9400: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
9410: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9420: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
9430: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9440: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9450: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9460: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9470: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9480: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9490: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
94a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
94b0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
94c0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
94d0: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
94e0: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
94f0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
9500: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
9510: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
9520: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
9530: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
9540: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9550: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9560: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9570: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9580: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9590: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
95a0: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
95b0: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
95c0: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
95d0: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
95e0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
95f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9600: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
9610: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9620: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
9630: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
9640: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9650: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9660: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9670: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9680: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9690: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
96a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
96b0: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
96c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
96d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
96e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
96f0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9700: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9710: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9720: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9730: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9740: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9750: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9760: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9770: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9780: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9790: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
97a0: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
97b0: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
97c0: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
97d0: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
97e0: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
97f0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9800: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9810: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9820: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9830: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9840: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9850: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9860: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9870: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9880: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9890: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
98a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
98b0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
98c0: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
98d0: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
98e0: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
98f0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9900: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9910: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9920: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9930: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9940: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9950: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9960: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9970: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
99a0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
99b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
99c0: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
99d0: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
99e0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
99f0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9a00: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9a10: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9a20: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9a30: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9a40: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9a50: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9a60: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9a70: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9a80: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9a90: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9aa0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9ab0: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ad0: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
9ae0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
9af0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
9b00: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
9b10: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
9b20: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
9b30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b40: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9b50: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9b60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
9b70: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
9b80: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
9b90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
9ba0: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
9bb0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9bc0: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
9bd0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9be0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9bf0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9c00: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9c10: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9c20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c30: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
9c40: 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61  LOCK || p->noRea
9c50: 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62  dlock );.      b
9c60: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9c70: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9c80: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
9c90: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9ca0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9cc0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9cd0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9ce0: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9cf0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9d00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9d10: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9d20: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
9d30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9d40: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
9d50: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
9d60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9d70: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9d80: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
9d90: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
9da0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9db0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9dc0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
9dd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9de0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9df0: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
9e00: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9e10: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9e20: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
9e30: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9e40: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9e70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e80: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e90: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9ea0: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
9eb0: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
9ec0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
9ed0: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
9ee0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
9ef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
9f00: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
9f10: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
9f20: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
9f30: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
9f40: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
9f50: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
9f60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
9f70: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
9f80: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
9f90: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fb0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9fc0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
9fd0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
9fe0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
9ff0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a000: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a010: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a020: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a030: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a040: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a050: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a070: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a080: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a090: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a0a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0b0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a0c0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a0d0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a0e0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a0f0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a100: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a110: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a120: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a130: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a140: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a150: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a160: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a170: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a190: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a1a0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a1b0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a1c0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a1d0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a1e0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a1f0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a200: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a210: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a220: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a230: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a240: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a250: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a260: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a270: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a280: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a290: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a2e0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a2f0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a300: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a310: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a320: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a330: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a340: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a350: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a360: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a370: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a380: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a390: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3a0: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a3b0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a3c0: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a3d0: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a3e0: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a3f0: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a400: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a410: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a420: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a430: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a440: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a450: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a460: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a470: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a490: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4a0: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a4b0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a4c0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a4d0: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a4e0: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a4f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a500: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a510: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a520: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a530: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a540: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a550: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a560: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a570: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a580: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a590: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a5a0: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a5b0: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a5c0: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a5d0: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a5e0: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a5f0: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a600: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a610: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a620: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a630: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a640: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a650: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
a660: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
a670: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
a680: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
a690: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
a6a0: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
a6b0: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
a6c0: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
a6d0: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
a6e0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
a6f0: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
a700: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
a710: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
a720: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a730: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
a740: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
a750: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
a760: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
a770: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
a780: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
a790: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
a7a0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
a7b0: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
a7c0: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
a7d0: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
a7e0: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
a7f0: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
a800: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
a810: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
a820: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
a830: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
a840: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
a850: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a860: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
a870: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
a880: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
a890: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a8a0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
a8b0: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
a8c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a8d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8e0: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
a8f0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
a900: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a910: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a920: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
a930: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
a940: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a950: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
a960: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
a970: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
a980: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a990: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
a9a0: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
a9b0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
a9c0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
a9d0: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
a9e0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
a9f0: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
aa00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa10: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
aa20: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
aa30: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
aa40: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
aa50: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
aa60: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
aa70: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
aa80: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
aa90: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aaa0: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
aab0: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
aac0: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
aad0: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
aae0: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
aaf0: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
ab00: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
ab10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ab30: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
ab40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
ab80: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ab90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aba0: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
abb0: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
abc0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
abd0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
abe0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
abf0: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
ac00: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ac10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac20: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
ac30: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
ac40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
ac50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ac60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
ac70: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
ac80: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
ac90: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
aca0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
acb0: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
acc0: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
acd0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
ace0: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
acf0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
ad00: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
ad10: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
ad20: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
ad30: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
ad40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
ad50: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
ad60: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
ad70: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
ad80: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
ad90: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
ada0: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
adb0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
adc0: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
add0: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
ade0: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
adf0: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
ae00: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
ae10: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ae20: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
ae30: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
ae40: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
ae50: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
ae60: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ae70: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
ae80: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
ae90: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
aea0: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
aeb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aec0: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
aed0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
aee0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
aef0: 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
af00: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
af10: 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ager;.  int i;. 
af20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
af30: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
af40: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
af50: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
af60: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
af70: 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  t[i];.    if( p-
af80: 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20  >nOrig>=pgno && 
af90: 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  0==sqlite3Bitvec
afa0: 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  Test(p->pInSavep
afb0: 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  oint, pgno) ){. 
afc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
afd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
afe0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
aff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b000: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b010: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b020: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b030: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b040: 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
b050: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b060: 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70  itvecTest(pPg->p
b070: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b080: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b090: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b0a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b0b0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b0c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b0d0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b0e0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b0f0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b110: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b120: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b130: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b140: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b150: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b160: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b170: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b180: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b190: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b1a0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b1b0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b1c0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b1d0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b1e0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b1f0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b200: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b210: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b220: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b230: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b240: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b250: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b260: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b270: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b280: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b290: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b2a0: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b2b0: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b2c0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b2d0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b2e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b2f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b300: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b310: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b320: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b330: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b340: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b350: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b360: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b370: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b380: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b390: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b3a0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b3b0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b3c0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b3d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b3e0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b3f0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b400: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b410: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b420: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b430: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b440: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b450: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b460: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b470: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b480: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b490: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b4a0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b4b0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b4c0: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b4d0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b4e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b4f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b500: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b510: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b520: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b530: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b540: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b550: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b560: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b570: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b580: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b590: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b5a0: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
b5b0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
b5c0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
b5d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b5e0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
b5f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
b600: 4d 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Mode );.  assert
b610: 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ( eLock==NO_LOCK
b620: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   || eLock==SHARE
b630: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
b640: 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  rt( eLock!=NO_LO
b650: 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  CK || pagerUseWa
b660: 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
b670: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
b680: 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
b690: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b6a0: 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock>=eLock );.
b6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b6c0: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
b6d0: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
b6e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
b6f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b700: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
b710: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
b720: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
b730: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
b740: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
b750: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
b760: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b770: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
b780: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
b790: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
b7a0: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
b7b0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
b7c0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
b7d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
b7e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
b7f0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
b800: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
b810: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
b820: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b830: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
b840: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
b850: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
b860: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
b870: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
b880: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
b890: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
b8a0: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
b8b0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
b8c0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
b8d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
b8e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
b8f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
b900: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
b910: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
b920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b930: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
b940: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
b950: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
b960: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
b970: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
b980: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
b990: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
b9a0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
b9b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
b9c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
b9d0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
b9e0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
b9f0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
ba00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
ba10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
ba20: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
ba30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
ba40: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
ba50: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f  NKNOWN_LOCK||eLo
ba60: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
ba70: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  CK) ){.      pPa
ba80: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ger->eLock = eLo
ba90: 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
baa0: 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
bab0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
bac0: 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
bad0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bae0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
baf0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
bb00: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
bb10: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
bb20: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
bb30: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
bb40: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
bb50: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
bb60: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
bb70: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
bb80: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
bb90: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
bba0: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
bbb0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
bbc0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
bbd0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
bbe0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
bbf0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
bc00: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
bc10: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
bc20: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
bc30: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
bc40: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
bc50: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
bc60: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
bc70: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
bc80: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
bc90: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
bca0: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
bcb0: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
bcc0: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
bcd0: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
bce0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
bcf0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
bd00: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
bd10: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
bd20: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
bd30: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
bd40: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
bd50: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
bd60: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
bd70: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
bd80: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
bd90: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
bda0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
bdb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
bdc0: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
bdd0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
bde0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
bdf0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
be00: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
be10: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
be20: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
be50: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
be60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
be70: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
be80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
be90: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
bea0: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
bed0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
bee0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
bef0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
bf00: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
bf10: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
bf20: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
bf30: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
bf40: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
bf50: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
bf60: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
bf70: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
bf80: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
bf90: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
bfa0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bfb0: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
bfc0: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
bfd0: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
bfe0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
bff0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
c000: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
c010: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
c030: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
c040: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
c050: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
c060: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
c070: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
c080: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
c090: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
c0a0: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
c0b0: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
c0c0: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
c0d0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
c0e0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
c0f0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
c100: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
c110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
c120: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
c130: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
c140: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
c150: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
c160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
c170: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
c180: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
c190: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
c1a0: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
c1b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c1c0: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
c1d0: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
c1e0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
c1f0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
c200: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
c210: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
c220: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c230: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
c240: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
c250: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
c260: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
c270: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
c280: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
c290: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
c2a0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c2b0: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
c2c0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
c2d0: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
c2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
c2f0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
c300: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
c310: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
c320: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c330: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
c340: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
c350: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
c360: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c370: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
c380: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
c390: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
c3a0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
c3b0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
c3c0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
c3d0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
c3e0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
c3f0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
c400: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
c410: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
c420: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
c430: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
c440: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
c450: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
c460: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
c470: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
c480: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
c490: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c4a0: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
c4b0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
c4c0: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
c4d0: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
c4e0: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
c4f0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c500: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
c510: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
c520: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
c530: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
c540: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
c550: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
c560: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
c570: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
c580: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
c590: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c5a0: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
c5b0: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
c5c0: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
c5d0: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
c5e0: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
c5f0: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
c600: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
c610: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
c620: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
c630: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
c640: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
c650: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
c660: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
c670: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
c680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
c690: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
c6a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
c6b0: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
c6c0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
c6d0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
c6e0: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
c6f0: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
c700: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
c710: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
c720: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
c730: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
c740: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c750: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
c760: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
c770: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
c780: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
c790: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
c7a0: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
c7b0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
c7c0: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
c7d0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
c7e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7f0: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
c800: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
c810: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
c820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c830: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
c840: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
c850: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
c860: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
c870: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
c880: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
c890: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
c8a0: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
c8b0: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
c8c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
c8d0: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
c8e0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
c8f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
c900: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
c910: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
c920: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c930: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
c940: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
c950: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
c960: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
c970: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
c980: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
c990: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
c9a0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
c9b0: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
c9c0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
c9d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
c9e0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
c9f0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
ca00: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
ca10: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
ca20: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
ca30: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ca40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ca50: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
ca60: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
ca70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
ca80: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
ca90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
caa0: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
cad0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
cae0: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
caf0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb10: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
cb20: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
cb30: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
cb40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb50: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
cb60: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
cb70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cb80: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
cb90: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
cba0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
cbb0: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
cbc0: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
cbd0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
cbe0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
cbf0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
cc00: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
cc10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cc20: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
cc30: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
cc40: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
cc50: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
cc60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
cc70: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
cc80: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
cc90: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
cca0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ccb0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
ccc0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
ccd0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
cce0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
ccf0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
cd00: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
cd10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
cd20: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
cd30: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
cd40: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
cd50: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
cd60: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
cd70: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
cd80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cd90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
cda0: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
cdb0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
cdc0: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
cdd0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
cde0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
cdf0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
ce00: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
ce10: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
ce20: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
ce30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
ce40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ce50: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
ce60: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
ce70: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
ce80: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
ce90: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
cea0: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
ceb0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
cec0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
ced0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
cee0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
cef0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
cf00: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
cf10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cf20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cf30: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
cf40: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
cf50: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
cf60: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
cf70: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
cf80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cf90: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
cfa0: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
cfb0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
cfc0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
cfd0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
cfe0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
cff0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
d000: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
d010: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
d020: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d050: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d060: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
d070: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
d080: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d090: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
d0b0: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
d0e0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
d0f0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
d100: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
d110: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
d120: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
d130: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
d140: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
d150: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
d160: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
d170: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
d180: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
d190: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
d1a0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
d1b0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
d1c0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d1d0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
d1e0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
d1f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d200: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
d210: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
d220: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d230: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
d240: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d250: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d260: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d270: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d280: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
d290: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
d2a0: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
d2b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
d2c0: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
d2d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
d2e0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
d2f0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
d300: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
d310: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d320: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
d330: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
d340: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d360: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
d370: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
d380: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
d390: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
d3a0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
d3b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
d3c0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
d3d0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
d3e0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
d3f0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
d400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
d410: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
d420: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
d430: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
d440: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
d450: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
d460: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
d470: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
d480: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
d490: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
d4a0: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
d4b0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
d4c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
d4d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
d4e0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
d4f0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
d500: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d510: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
d520: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
d530: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
d540: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
d550: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
d560: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
d570: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
d580: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
d590: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
d5a0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
d5b0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
d5c0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
d5d0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
d5e0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
d5f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
d600: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
d610: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
d620: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
d630: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
d640: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d670: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d680: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
d690: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
d6a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
d6b0: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
d6c0: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
d6d0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
d6e0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
d6f0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
d700: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
d710: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
d720: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
d730: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
d740: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
d750: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d760: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
d770: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
d780: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d790: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d7a0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
d7b0: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
d7c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
d7d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
d7e0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
d7f0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
d800: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
d810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
d820: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
d830: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d840: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
d850: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
d860: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
d870: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
d880: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d890: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d8a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d8b0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d8c0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d8d0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d8e0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d8f0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d900: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d910: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d920: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d930: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d940: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d950: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d960: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d970: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d980: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d990: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d9a0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d9b0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d9c0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d9d0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d9e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d9f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
da00: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
da10: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
da20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
da30: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
da40: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
da50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
da60: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
da70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
da80: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
daa0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
dab0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
dac0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
dad0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
dae0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
daf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
db00: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
db10: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
db20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
db30: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
db40: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
db50: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
db60: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
db70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
db80: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
db90: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
dba0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
dbb0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
dbc0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
dbd0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
dbe0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
dbf0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
dc00: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
dc10: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dc20: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dc30: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dc40: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dc50: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dc60: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dc70: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dc80: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dc90: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dca0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dcb0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
dcc0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
dcd0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dce0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dcf0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dd00: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dd10: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dd20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dd30: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dd40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dd50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dd60: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dd70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dd80: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dd90: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dda0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
ddb0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
ddc0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
ddd0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dde0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
ddf0: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
de00: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
de10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
de20: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
de30: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
de60: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
de70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dea0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
deb0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dec0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
ded0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
dee0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
def0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
df00: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
df10: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
df20: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
df30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
df40: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
df50: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
df60: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
df70: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
df80: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
df90: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
dfa0: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
dfb0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
dfc0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
dfd0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
dfe0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
dff0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e000: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e010: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e020: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e030: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e040: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e050: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e060: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e070: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e080: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e090: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e0a0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e0b0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e0c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e0d0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e0e0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e0f0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e100: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e110: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e120: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e130: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e140: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e150: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e160: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e170: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e180: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e190: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e1a0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e1b0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e1c0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e1d0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e1e0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e1f0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e200: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e210: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e220: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e230: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e240: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e250: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e260: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e270: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e280: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e290: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e2a0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e2b0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e2c0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e2d0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e2e0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e2f0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e300: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e310: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e320: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e330: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e340: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e350: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e360: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e370: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e380: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e390: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e3a0: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e3b0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e3c0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e3d0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e3e0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e3f0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e400: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e410: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e420: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e430: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e440: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e450: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e460: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e470: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e480: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e490: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e4a0: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e4b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e4c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e4d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e4e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e4f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e500: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e510: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e530: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e540: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e550: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e560: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e570: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e580: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e590: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e5a0: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e5b0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e5c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e5d0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e5e0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e5f0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e600: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e610: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e620: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e630: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e640: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e650: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e660: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e670: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e680: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e690: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e6a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e6b0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e6c0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e6d0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e6e0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e6f0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e700: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e710: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e720: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e730: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e740: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e750: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e760: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e770: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e780: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e790: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e7a0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e7b0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e7c0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e7d0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e7e0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e7f0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e800: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e810: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e820: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e830: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e840: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e850: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e860: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e870: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e880: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e890: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e8a0: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e8b0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e8c0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e8d0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e8e0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e8f0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e900: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e910: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e920: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e930: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e940: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e950: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e960: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e970: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e980: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e990: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e9a0: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e9b0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e9c0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e9d0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e9e0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e9f0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
ea00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ea10: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
ea20: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
ea30: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
ea40: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
ea50: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
ea60: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
ea70: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ea80: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ea90: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
eaa0: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
eab0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
eac0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ead0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
eae0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
eaf0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
eb00: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
eb10: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
eb20: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eb30: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
eb40: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
eb50: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
eb60: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
eb70: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
eb80: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
eb90: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
eba0: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
ebb0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
ebc0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
ebd0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
ebe0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
ebf0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
ec00: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
ec10: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
ec20: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ec30: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ec40: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ec50: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ec60: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ec70: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ec80: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ec90: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
eca0: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
ecb0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
ecc0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
ecd0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
ece0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ecf0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ed00: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ed10: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
ed20: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ed30: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ed40: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ed50: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ed60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ed70: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ed80: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ed90: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
eda0: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
edb0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
edc0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
edd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ede0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
edf0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ee00: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ee10: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
ee20: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ee30: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
ee40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ee50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ee60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
ee70: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ee80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ee90: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
eea0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
eeb0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
eec0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
eed0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
eee0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
eef0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
ef00: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
ef10: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
ef20: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
ef30: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
ef40: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
ef50: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
ef60: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
ef70: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ef80: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ef90: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
efa0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
efb0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
efc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efd0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
efe0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
eff0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f000: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f010: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f020: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f030: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f040: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f050: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f060: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f070: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f080: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f090: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f0a0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f0b0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f0c0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f0d0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f0f0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f100: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f110: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f120: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f130: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f140: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f150: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f160: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f170: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f180: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f190: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f1a0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f1b0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f1c0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f1d0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f1e0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f200: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f210: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f230: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f240: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f250: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f270: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f280: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f290: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f2a0: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f2c0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f2d0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f2e0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f2f0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f300: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f310: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f320: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f330: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f360: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f370: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f380: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f390: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f3a0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f3b0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f3d0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f3e0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f3f0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f400: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f410: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f420: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f430: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f440: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f450: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f460: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f470: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f480: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f490: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f4a0: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f4b0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f4c0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f4d0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f4e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f4f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f500: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f510: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f520: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f530: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f540: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f550: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f560: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f570: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f580: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f590: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f5a0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f5b0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f5c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f5d0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f5e0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f5f0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f600: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f610: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f620: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f630: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f640: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f650: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f660: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f670: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f680: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f690: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f6a0: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f6b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f6c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f6d0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f6e0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f6f0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f700: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f710: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f720: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f730: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f740: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f750: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f760: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f790: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f7a0: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f7b0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f7c0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f7d0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f7e0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f7f0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f800: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f810: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f820: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f830: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f840: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f850: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f860: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f870: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f880: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f890: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f8a0: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f8b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f8c0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f8d0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f8e0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f8f0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f900: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f910: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f920: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f930: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f940: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f950: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f960: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f970: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f980: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f990: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f9a0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f9b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f9c0: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f9d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f9e0: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f9f0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
fa00: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
fa10: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
fa20: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
fa30: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
fa40: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
fa50: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
fa60: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fa70: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa80: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fa90: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
faa0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fab0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fac0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fad0: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fae0: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
faf0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fb00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
fb10: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fb20: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fb30: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fb40: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fb50: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
fb60: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb70: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb80: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb90: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fba0: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fbb0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fbc0: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fbd0: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fbe0: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fbf0: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fc00: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fc10: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fc20: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fc30: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fc40: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fc50: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fc60: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc70: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc80: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc90: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fca0: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fcb0: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fcc0: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fcd0: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fce0: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fcf0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fd00: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fd10: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fd20: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fd30: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fd40: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fd50: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fd60: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd70: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd80: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd90: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fda0: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fdb0: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fdc0: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fdd0: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fde0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fdf0: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fe00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fe10: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fe20: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fe30: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fe40: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fe50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fe60: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe70: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe80: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe90: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fea0: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
feb0: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fec0: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fed0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fee0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fef0: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
ff00: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
ff10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ff20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ff30: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
ff40: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
ff50: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
ff60: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff70: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff80: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff90: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ffa0: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ffb0: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ffc0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ffd0: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ffe0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
fff0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
10000 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
10010 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
10020 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
10030 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
10040 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
10050 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
10060 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10070 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10090 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
100a0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
100b0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
100c0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
100d0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
100e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
100f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10100 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
10110 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10120 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10130 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
10140 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
10150 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
10160 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10170 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10180 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10190 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
101a0 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
101b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
101c0 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
101d0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
101e0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
101f0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10200 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
10210 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
10220 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
10230 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
10240 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
10250 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
10260 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10270 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10280 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10290 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
102a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
102b0 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
102c0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
102d0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
102e0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
102f0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10300 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10310 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
10320 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
10330 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
10340 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
10350 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
10360 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10370 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10380 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10390 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
103a0 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
103b0 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
103c0 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
103d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
103e0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
103f0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10400 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
10410 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
10420 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
10430 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10440 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
10450 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
10460 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10470 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10480 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
104b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
104c0 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
104d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
104e0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
104f0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10500 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10520 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
10530 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
10540 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
10550 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10560 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10570 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10580 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10590 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105b0 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
105c0 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
105d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
105e0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
105f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10600 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
10610 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
10620 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
10630 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10640 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10650 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
10660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10670 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10680 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
106a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
106b0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
106c0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
106d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
106e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
106f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10700 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
10710 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
10720 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
10730 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
10740 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
10750 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
10760 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10770 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10780 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10790 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
107a0 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
107b0 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
107c0 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
107d0 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
107e0 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
107f0 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10800 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10810 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
10820 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
10830 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
10840 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
10850 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
10860 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10870 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10880 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10890 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
108a0 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
108b0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
108c0 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
108d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
108e0 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
108f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10900 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
10910 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
10920 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
10930 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10940 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
10950 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
10960 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10970 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10980 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10990 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
109a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
109b0 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
109c0 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
109d0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
109e0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
109f0 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10a00 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
10a10 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10a20 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10a30 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10a40 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
10a50 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10a60 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a70 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a80 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a90 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10aa0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10ab0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10ac0 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10ad0 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10ae0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10b00 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10b10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10b20 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10b30 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10b40 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10b50 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10b60 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b70 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b80 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b90 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10ba0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10bb0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10bc0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10bd0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10be0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10bf0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10c00 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10c10 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10c20 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10c30 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10c40 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10c50 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10c60 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c70 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c80 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10ca0 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10cb0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10cc0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10cd0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10ce0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10cf0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10d00 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10d10 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10d20 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10d30 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10d40 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10d50 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10d60 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d70 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d90 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10da0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10db0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10dd0 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10de0 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10df0 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10e00 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10e10 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10e20 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10e30 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10e40 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10e50 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10e60 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e70 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e80 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e90 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10ea0 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10ed0 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10ee0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10ef0 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10f00 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10f10 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10f20 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10f30 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10f40 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10f50 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10f60 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f70 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f80 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f90 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10fa0 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10fb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10fc0 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10fd0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10fe0 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10ff0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11000 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11010 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11020 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
11030 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
11040 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
11050 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
11060 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11070 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11080 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11090 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
110a0 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
110b0 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
110c0 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
110d0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
110e0 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
110f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11100 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
11110 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11120 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11130 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11140 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11150 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11170 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11180 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11190 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
111a0 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
111b0 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
111c0 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
111d0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
111e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
111f0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11200 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11210 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11230 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11240 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
11250 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
11260 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11270 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11280 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11290 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
112a0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
112b0 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
112c0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
112d0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
112e0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
112f0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11300 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11310 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
11320 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
11330 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
11340 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
11350 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
11360 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11370 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11380 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11390 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
113a0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
113b0 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
113c0 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
113d0 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
113e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
113f0 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11420 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11430 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11440 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
11450 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
11460 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11470 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11480 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11490 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
114a0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
114b0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
114c0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
114d0 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
114e0 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
114f0 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11500 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
11510 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
11520 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11540 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11550 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
11560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11570 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11580 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11590 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
115a0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
115b0 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
115c0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
115d0 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
115e0 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
115f0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11600 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
11610 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11620 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
11630 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
11640 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
11650 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
11660 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11670 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11680 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11690 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
116a0 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
116b0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
116c0 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
116d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
116e0 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
116f0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11700 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11710 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
11720 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
11730 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
11740 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
11750 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
11760 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11770 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11780 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11790 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
117a0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
117b0 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
117c0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
117d0 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
117e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
117f0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11800 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
11810 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
11820 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
11830 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
11840 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
11850 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11860 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11870 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11880 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11890 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
118a0 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
118b0 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
118c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
118d0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
118e0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
118f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11900 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
11910 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
11920 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
11930 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
11940 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11950 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
11960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11970 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11980 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11990 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
119a0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
119b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
119c0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
119d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
119e0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
119f0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11a00 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
11a10 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
11a20 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
11a30 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
11a40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11a50 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a80 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a90 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11aa0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11ab0 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11ac0 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11ad0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11ae0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11af0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11b00 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11b10 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11b20 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11b30 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11b40 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11b50 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11b60 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b70 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b80 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11ba0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11bb0 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11bc0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11bd0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11be0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11bf0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11c00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11c10 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11c20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11c30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11c40 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11c60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c70 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c80 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c90 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11ca0 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11cb0 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11cc0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11cd0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11ce0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11cf0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11d00 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11d10 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11d20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11d30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11d40 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11d50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d70 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d90 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11da0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11db0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11dc0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11dd0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11de0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11df0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11e00 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11e10 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11e20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11e30 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11e40 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11e50 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11e60 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e70 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e80 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e90 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11ea0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11eb0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11ec0 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11ed0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11ee0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11ef0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11f00 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11f10 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11f20 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11f30 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11f40 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11f50 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11f60 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f70 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f80 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f90 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11fa0 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11fb0 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11fc0 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11fd0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11fe0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11ff0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
12000 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
12010 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12020 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12030 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12040 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12050 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12060 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12070 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12080 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12090 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
120a0 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
120b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
120c0 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
120d0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
120e0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
120f0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12100 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12110 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12120 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12130 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12140 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12150 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12160 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12170 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12180 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12190 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
121a0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
121b0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
121c0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
121d0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
121e0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
121f0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12200 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
12210 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12220 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12230 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12250 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
12260 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12270 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12280 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12290 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
122a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
122b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
122c0 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
122d0 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
122e0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
122f0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12300 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
12310 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
12320 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
12330 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
12340 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
12350 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
12360 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12370 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12380 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12390 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
123a0 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
123b0 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
123c0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
123d0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
123e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12400 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
12410 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12420 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
12430 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
12440 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
12450 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
12460 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12470 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12480 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12490 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
124a0 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
124b0 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
124c0 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
124d0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
124e0 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
124f0 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12500 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
12510 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
12520 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 20 45 78 63  .errCode..** Exc
12530 65 70 74 2c 20 69 66 20 74 68 65 20 65 72 72 6f  ept, if the erro
12540 72 2d 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r-code is SQLITE
12550 5f 46 55 4c 4c 2c 20 63 61 6c 6c 73 20 74 6f 20  _FULL, calls to 
12560 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 20 61 6e  PagerLookup() an
12570 64 0a 2a 2a 20 50 61 67 65 72 41 63 71 75 69 72  d.** PagerAcquir
12580 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
12590 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 65   if the pager we
125a0 72 65 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  re in PAGER_READ
125b0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ER state..**.** 
125c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
125d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
125e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
125f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12600 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12610 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12620 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12630 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12640 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12650 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12660 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12680 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12690 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
126a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
126b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
126c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
126d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
126e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
126f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12710 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12720 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12730 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12740 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12750 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12760 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12770 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12780 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12790 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
127a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
127b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
127c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
127d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
127e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
127f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12800 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12810 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12820 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12830 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12840 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12850 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12860 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12870 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12880 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12890 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
128a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
128b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
128c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
128d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
128e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
128f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12900 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12910 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12930 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12940 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12950 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12960 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12970 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12980 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12990 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
129a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
129b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
129c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
129d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
129e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
129f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12a00 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12a10 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12a20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12a30 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12a40 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12a50 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12a60 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12a70 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12a80 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12a90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
12aa0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
12ab0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
12ac0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
12ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
12ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
12af0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12b00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12b10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12b20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12b30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12b40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12b50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12b60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12b70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12b80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12b90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12ba0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12bb0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12bc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12bd0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12be0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12bf0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12c00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12c10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12c20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12c30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12c40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12c50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12c60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12c70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12c80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12c90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ca0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12cb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12cc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12cd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12ce0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12cf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12d00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12d10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12d20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12d30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12d40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12d50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12d60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12d70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12d80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12d90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12da0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12db0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12dc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12dd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12de0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12df0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12e00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12e10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12e20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12e30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12e40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12e50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
12e60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12e70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12e80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12e90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12ea0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12eb0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12ec0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12ed0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12ee0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12ef0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12f00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12f10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12f20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12f30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12f40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12f50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12f60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12f70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12f80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12f90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12fa0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12fb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12fc0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12fd0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12fe0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ff0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
13000 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
13010 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
13020 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
13030 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
13040 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
13050 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
13060 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
13070 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
13080 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
13090 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
130a0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
130b0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
130c0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
130d0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
130e0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
130f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13100 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13110 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13120 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13130 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13140 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13150 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13160 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13170 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13180 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
131a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
131b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
131c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
131d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
131e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
131f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13200 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13210 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13220 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13230 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13240 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13250 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13260 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13270 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13280 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13290 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
132a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
132b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
132c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
132d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
132e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
132f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13300 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13310 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13320 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13330 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13340 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13350 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13360 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13370 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13380 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13390 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
133a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
133b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
133c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
133d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
133e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
133f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13400 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13410 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13420 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13430 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13440 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13450 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13460 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13470 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13490 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
134a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
134b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
134c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
134d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
134e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
134f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13500 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13510 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13520 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13530 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13540 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13550 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13560 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13570 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13580 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13590 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
135a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
135b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
135c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
135d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
135e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
135f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13600 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13620 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13630 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13640 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13650 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13660 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13670 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13690 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
136a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
136b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
136c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
136d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
136e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
136f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13700 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13710 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13720 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13730 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13740 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13750 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13760 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13770 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13780 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
137a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
137b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
137c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
137d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
137e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
137f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13800 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13810 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13820 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13840 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13850 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13860 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13870 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13880 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13890 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
138a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
138b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
138c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
138d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
138e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
138f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13900 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13910 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13920 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13930 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13940 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13950 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13960 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13970 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13980 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
139a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
139b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
139c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
139d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
139e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
139f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13a00 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13a10 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13a20 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13a30 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13a40 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13a50 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13a60 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13a70 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13a80 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13a90 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13aa0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
13ab0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
13ac0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
13ad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
13ae0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13af0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13b00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13b10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13b20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13b30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13b40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13b50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13b70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13b80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13b90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13ba0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13bb0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13bc0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13bd0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13be0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13bf0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13c00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13c10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13c20 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
13c30 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
13c40 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  S.    sqlite3Pca
13c50 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
13c60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13c70 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
13c80 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ash);.#endif.  }
13c90 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13ca0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13cb0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
13cc0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13cd0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
13ce0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
13cf0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
13d00 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
13d10 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
13d20 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
13d30 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
13d40 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
13d50 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
13d60 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
13d70 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
13d80 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
13d90 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
13da0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
13db0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
13dc0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13dd0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
13de0 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
13df0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
13e00 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
13e10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13e20 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13e30 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
13e40 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
13e50 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
13e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
13e70 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
13e80 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
13e90 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
13ea0 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72  e .   && (!pager
13eb0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c  UseWal(pPager) |
13ec0 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  | sqlite3WalExcl
13ed0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
13ee0 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b  ->pWal, 0)).  ){
13ef0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
13f00 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
13f10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
13f20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
13f30 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
13f40 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53    }.  pPager->eS
13f50 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
13f60 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  DER;.  pPager->s
13f70 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  etMaster = 0;.. 
13f80 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
13f90 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
13fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
13fb0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
13fc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13fd0 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
13fe0 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
13ff0 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
14000 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
14010 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14020 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14030 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
14040 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
14050 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
14060 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
14070 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
14080 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
14090 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
140a0 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
140b0 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
140c0 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
140d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
140e0 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  nd move the page
140f0 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  r back to OPEN s
14100 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a  tate. If this .*
14110 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
14120 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
14130 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
14140 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
14150 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63   next .** connec
14160 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61  tion to obtain a
14170 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
14180 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68  the pager (which
14190 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65   may be this one
141a0 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20  ) .** will roll 
141b0 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
141c0 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
141d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65  not already ente
141e0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
141f0 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f  ate, but an IO o
14200 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  r.** malloc erro
14210 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14220 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  a rollback, then
14230 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c   this will itsel
14240 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  f cause .** the 
14250 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
14260 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
14270 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c  Which will be cl
14280 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  eared by the.** 
14290 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
142a0 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72  lock(), as descr
142b0 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
142c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
142d0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
142e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
142f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
14300 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
14310 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ROR && pPager->e
14320 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
14330 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
14340 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
14350 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
14360 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
14370 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
14380 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
14390 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
143a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
143b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
143c0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
143d0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
143e0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
143f0 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ();.    }else if
14400 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
14410 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
14420 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14430 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
14440 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20  READER );.      
14450 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
14460 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
14470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14480 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14490 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
144a0 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
144b0 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
144c0 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
144d0 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
144e0 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
144f0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14500 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14510 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14520 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14530 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14540 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14550 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14560 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14570 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14580 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14590 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
145a0 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
145b0 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
145c0 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
145d0 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
145e0 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
145f0 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14600 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14610 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14620 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14630 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14640 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14650 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14660 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14670 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14680 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14690 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
146a0 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
146b0 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
146c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
146d0 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
146e0 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
146f0 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
14700 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
14710 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
14720 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
14730 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
14740 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14750 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14760 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14770 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14780 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14790 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
147a0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
147b0 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
147c0 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
147d0 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
147e0 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
147f0 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
14800 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
14810 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
14820 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
14830 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
14840 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14850 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14860 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14870 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14880 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14890 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
148a0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
148b0 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
148c0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
148d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
148e0 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
148f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14900 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
14910 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
14920 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
14930 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
14940 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
14950 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
14960 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
14970 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
14980 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
14990 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
149a0 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
149b0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
149c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
149d0 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
149e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
149f0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14a00 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
14a10 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
14a20 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
14a30 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
14a40 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
14a70 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
14a80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14a90 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
14aa0 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
14ab0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
14ac0 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
14ad0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
14ae0 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
14af0 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
14b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
14b10 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
14b20 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
14b30 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
14b40 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
14b50 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
14b60 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
14b70 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
14b80 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
14b90 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
14ba0 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
14bb0 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
14bc0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
14bd0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
14be0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
14bf0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
14c00 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
14c10 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
14c20 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
14c30 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
14c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
14c50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14c60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
14c70 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
14c80 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
14c90 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
14ca0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
14cb0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
14cc0 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
14cd0 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
14ce0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
14cf0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
14d00 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
14d10 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
14d20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
14d30 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
14d40 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
14d50 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
14d60 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
14d70 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
14d80 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d90 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
14da0 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
14db0 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
14dc0 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
14dd0 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
14de0 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
14df0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
14e00 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
14e10 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
14e20 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
14e30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14e40 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
14e50 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14e60 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14e70 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
14e80 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
14e90 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
14ea0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
14eb0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
14ec0 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
14ed0 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
14ee0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
14ef0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
14f00 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
14f10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14f20 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
14f30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14f40 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
14f50 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
14f60 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14f70 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14f80 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
14f90 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
14fa0 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
14fb0 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
14fc0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
14fd0 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
14fe0 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
14ff0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
15000 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
15010 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
15020 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
15030 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
15040 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
15050 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15060 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15070 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15080 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15090 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
150a0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
150b0 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
150c0 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
150d0 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
150e0 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
150f0 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15100 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15110 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15120 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15130 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
15140 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15150 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15160 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15170 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15180 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15190 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
151a0 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
151b0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
151c0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
151d0 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
151e0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
151f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15210 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15220 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15230 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15260 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15270 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15280 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15290 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
152a0 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
152b0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
152c0 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152e0 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
152f0 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15300 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15310 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15320 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15330 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
15340 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15350 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15360 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15370 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15380 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15390 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
153a0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
153c0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
153d0 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
153e0 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
153f0 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15400 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15410 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15420 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15430 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15460 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15470 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15480 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15490 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
154a0 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
154b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
154c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
154d0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
154e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
154f0 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15500 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15510 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15520 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15530 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15540 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15550 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15560 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15570 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15580 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15590 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
155a0 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
155b0 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
155c0 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
155d0 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
155e0 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
155f0 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15600 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15610 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15620 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15630 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15640 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15650 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15660 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15670 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15680 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15690 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
156a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
156b0 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
156c0 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
156d0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
156e0 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
156f0 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
15700 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
15710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
15720 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15730 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
15740 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15750 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15760 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15770 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15780 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15790 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
157a0 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
157b0 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
157c0 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
157d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
157e0 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
157f0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
15800 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
15810 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
15820 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
15830 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
15840 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15850 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15860 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15870 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15880 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15890 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
158a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
158b0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
158c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
158d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
158e0 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
158f0 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
15900 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
15910 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
15920 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
15930 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
15940 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
15950 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
15960 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
15970 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15980 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
15990 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
159a0 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
159b0 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
159c0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
159d0 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
159e0 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
159f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a00 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
15a10 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
15a20 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
15a30 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
15a40 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
15a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
15a70 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
15a80 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
15a90 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
15aa0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
15ab0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
15ac0 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
15ad0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15ae0 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
15af0 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
15b00 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
15b10 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
15b20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
15b30 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
15b40 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
15b50 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
15b60 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
15b70 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
15b80 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
15b90 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
15ba0 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
15bb0 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
15bc0 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
15bd0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
15be0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15bf0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
15c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
15c10 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
15c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15c30 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
15c40 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
15c50 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
15c60 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
15c70 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
15c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
15ca0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
15cb0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
15cc0 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
15cd0 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
15ce0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15cf0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
15d00 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
15d10 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
15d20 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
15d30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15d40 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
15d50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
15d60 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
15d70 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15d80 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
15d90 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
15da0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
15db0 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
15dc0 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
15dd0 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
15de0 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
15df0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
15e00 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
15e30 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
15e40 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
15e50 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
15e60 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
15e70 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
15e80 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
15e90 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
15ea0 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
15eb0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
15ec0 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
15ed0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
15ee0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
15ef0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15f00 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
15f10 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
15f20 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
15f30 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
15f40 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
15f50 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
15f60 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
15f70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
15f80 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
15f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15fa0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
15fb0 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
15fc0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
15fd0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
15fe0 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
15ff0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
16000 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
16010 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
16020 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
16030 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
16040 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
16050 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16060 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16070 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16080 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16090 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
160a0 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
160b0 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
160c0 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
160d0 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
160e0 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
160f0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16100 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16110 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16120 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
16130 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
16140 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16150 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16160 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16170 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
16180 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16190 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
161a0 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
161b0 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
161c0 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
161d0 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
161e0 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
161f0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16200 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16210 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16220 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
16230 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
16240 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
16250 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
16260 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
16270 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
16280 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16290 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
162a0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
162b0 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
162c0 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
162d0 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
162e0 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
162f0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
16300 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
16310 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16320 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16330 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
16340 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
16350 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
16360 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16370 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
16380 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16390 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
163a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
163b0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
163c0 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
163d0 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
163e0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
163f0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
16400 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
16410 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
16420 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
16430 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
16440 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16450 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16460 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16470 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16480 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16490 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
164a0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
164b0 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
164c0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
164d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
164e0 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
164f0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
16500 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
16510 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
16520 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
16530 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
16540 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16560 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16570 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16580 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16590 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
165a0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
165b0 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
165c0 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
165d0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
165e0 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
165f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16600 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
16610 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
16620 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
16630 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
16640 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16650 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16660 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16670 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16680 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16690 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
166a0 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
166b0 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
166c0 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
166d0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
166e0 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
166f0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
16700 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
16710 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
16720 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16730 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
16740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16750 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
16760 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
16770 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16780 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
16790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
167a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
167b0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b  PEN || pPg==0 );
167c0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
167d0 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
167e0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
167f0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
16800 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16810 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
16820 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
16830 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
16840 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
16850 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
16860 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
16870 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
16880 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16890 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
168a0 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
168b0 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
168c0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
168d0 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
168e0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
168f0 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
16900 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
16910 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
16920 20 7d 0a 20 20 69 66 28 20 28 70 50 61 67 65 72   }.  if( (pPager
16930 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16940 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
16950 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16960 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
16970 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
16980 3e 66 64 29 0a 20 20 20 26 26 20 69 73 53 79 6e  >fd).   && isSyn
16990 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
169a0 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
169b0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
169c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
169d0 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
169e0 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
169f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
16a00 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
16a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
16a20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
16a30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
16a40 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
16a50 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
16a60 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
16a70 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
16a80 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
16a90 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
16aa0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
16ab0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
16ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16ad0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
16ae0 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
16af0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
16b00 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
16b10 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
16b20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
16b30 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
16b40 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
16b50 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
16b60 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
16b70 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
16b80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
16b90 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
16ba0 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
16bb0 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
16bc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16bd0 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
16be0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
16bf0 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
16c00 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
16c10 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
16c20 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16c30 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
16c40 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
16c50 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
16c60 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
16c70 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
16c80 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
16c90 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
16ca0 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
16cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16cc0 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
16cd0 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
16ce0 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
16cf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
16d00 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
16d10 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
16d20 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
16d30 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
16d40 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
16d50 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
16d60 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
16d70 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
16d80 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
16d90 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
16da0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
16db0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16dc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
16dd0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
16de0 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
16df0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
16e00 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
16e10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16e20 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
16e30 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
16e40 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
16e50 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
16e60 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
16e70 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
16e80 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
16e90 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16ea0 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
16eb0 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
16ec0 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
16ed0 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
16ee0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
16ef0 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
16f00 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
16f10 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
16f20 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
16f30 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16f40 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
16f50 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16f60 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
16f70 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f80 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
16f90 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
16fa0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
16fb0 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
16fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
16fd0 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  otSpill==1 );.  
16fe0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
16ff0 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  pill--;.    if( 
17000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
17020 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
17030 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
17040 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17050 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
17060 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
17070 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
17080 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
17090 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
170a0 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
170b0 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
170c0 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
170d0 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
170e0 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
170f0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
17100 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
17110 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
17120 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
17130 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
17140 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
17150 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
17160 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
17170 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
17180 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
17190 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
171a0 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
171b0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
171c0 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
171d0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
171e0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
171f0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
17200 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17210 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
17220 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
17230 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
17240 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
17250 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
17260 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
17270 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17280 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
17290 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
172a0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
172b0 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
172c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
172d0 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
172e0 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
172f0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
17300 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
17310 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
17320 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
17330 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
17340 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
17350 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
17360 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
17370 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
17380 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
17390 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
173a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
173b0 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
173c0 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
173d0 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
173e0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
173f0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
17400 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
17410 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
17420 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
17430 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
17440 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
17450 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
17460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17470 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
17480 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
17490 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
174a0 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
174b0 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
174c0 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
174d0 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
174e0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
174f0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
17500 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
17510 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
17520 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
17530 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
17540 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
17550 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
17560 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
17570 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
17580 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
17590 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
175a0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
175b0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
175c0 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
175d0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
175e0 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
175f0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17600 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
17610 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
17620 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
17630 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
17640 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
17650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17660 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
17670 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
17680 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
17690 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
176a0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
176b0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
176c0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
176d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
176e0 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
176f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
17700 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
17710 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
17720 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17730 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
17740 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
17750 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
17760 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
17770 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17780 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
17790 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
177a0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
177b0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
177c0 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
177d0 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
177e0 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
177f0 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
17800 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
17810 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
17820 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
17830 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
17840 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
17850 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
17860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
17870 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
17880 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
17890 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
178a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
178b0 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
178c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
178d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
178e0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
178f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17900 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
17910 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
17920 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
17930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
17940 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
17950 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
17960 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
17970 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17980 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
17990 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
179a0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
179b0 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
179c0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
179d0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
179e0 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
179f0 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
17a00 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
17a10 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
17a20 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
17a30 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
17a40 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
17a50 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
17a60 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
17a70 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
17a80 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
17a90 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
17aa0 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
17ab0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
17ac0 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
17ad0 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
17ae0 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
17af0 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
17b00 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
17b10 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
17b20 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
17b30 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
17b40 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
17b50 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
17b60 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
17b70 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
17b80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
17b90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
17ba0 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
17bb0 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
17bc0 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
17bd0 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
17be0 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
17bf0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
17c00 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
17c10 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
17c20 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
17c30 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
17c40 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
17c50 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
17c60 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
17c70 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
17c80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
17c90 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
17ca0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17cb0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
17cc0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
17cd0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
17ce0 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
17cf0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17d00 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
17d10 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
17d20 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
17d30 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
17d40 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
17d50 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
17d60 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
17d70 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
17d80 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
17d90 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
17da0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
17db0 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
17dc0 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
17dd0 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
17de0 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
17df0 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
17e00 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
17e10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
17e20 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
17e30 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
17e40 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
17e50 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
17e60 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
17e70 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
17e80 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
17e90 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
17ea0 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
17eb0 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
17ec0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
17ed0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
17ee0 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
17ef0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
17f00 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
17f10 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
17f20 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
17f30 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
17f40 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
17f50 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
17f60 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
17f70 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
17f80 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
17f90 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
17fa0 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
17fb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
17fc0 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
17fd0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
17fe0 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
17ff0 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
18000 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
18010 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18020 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18030 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
18040 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
18050 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
18060 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
18070 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
18080 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
18090 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
180a0 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
180b0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
180c0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
180d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
180e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
180f0 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18120 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18130 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
18140 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
18150 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18160 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
18170 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
18180 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
18190 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
181a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
181b0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
181c0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
181d0 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
181e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
181f0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
18200 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
18210 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
18220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18230 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
18240 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
18250 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
18260 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
18270 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
18280 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
18290 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
182a0 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
182b0 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
182c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
182d0 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
182e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
182f0 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
18300 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
18310 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
18320 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
18330 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
18340 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
18350 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
18360 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
18370 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
18380 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18390 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
183a0 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
183b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
183c0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
183d0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
183e0 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
183f0 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
18400 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
18410 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
18420 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
18430 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
18440 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
18460 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
18470 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
18480 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
18490 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
184a0 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
184b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
184c0 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
184d0 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
184e0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
184f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
18500 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
18510 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
18520 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18530 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
18540 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
18550 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
18560 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
18570 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
18580 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
18590 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
185a0 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
185b0 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
185c0 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
185d0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
185e0 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
185f0 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
18600 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
18610 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
18620 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
18630 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
18640 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
18650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18660 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
18670 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
18680 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
18690 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
186a0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
186b0 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
186c0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
186d0 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
186e0 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
186f0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
18700 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18710 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
18720 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
18730 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
18740 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
18750 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
18760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18770 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
18780 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
18790 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
187a0 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
187b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
187c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
187d0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
187e0 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
187f0 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
18800 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
18810 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
18820 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
18830 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
18840 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
18850 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
18860 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
18870 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
18880 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
18890 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
188a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
188b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
188c0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
188d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
188e0 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
188f0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
18900 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
18910 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
18920 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
18930 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
18940 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
18950 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
18960 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18970 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
18980 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
18990 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
189a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
189b0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
189c0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
189d0 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
189e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
189f0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18a00 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
18a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18a20 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
18a30 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
18a40 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
18a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
18a70 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18a80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18a90 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
18aa0 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
18ab0 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
18ac0 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
18ad0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
18ae0 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
18af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
18b10 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18b20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18b30 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
18b40 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
18b50 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
18b60 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
18b70 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
18b80 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
18b90 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
18ba0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18bb0 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
18bc0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
18bd0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
18be0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
18bf0 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
18c00 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
18c10 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
18c20 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
18c30 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
18c40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
18c50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
18c60 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
18c70 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
18c80 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
18c90 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
18ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
18cb0 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
18cc0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
18cd0 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
18ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18cf0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
18d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18d10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18d20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
18d30 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
18d40 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
18d50 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
18d60 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
18d70 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
18d80 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
18d90 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
18da0 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
18db0 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
18dc0 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
18dd0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
18de0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
18df0 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
18e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
18e10 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
18e20 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
18e30 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
18e40 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
18e50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
18e60 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
18e70 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
18e80 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
18e90 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
18ea0 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
18eb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18ec0 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
18ed0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
18ee0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
18ef0 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
18f00 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
18f10 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
18f20 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
18f30 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
18f40 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
18f50 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
18f60 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
18f70 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
18f80 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
18f90 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
18fa0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
18fb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
18fc0 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
18fd0 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
18fe0 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
18ff0 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
19000 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
19010 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
19020 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
19030 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
19040 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
19050 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
19060 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19070 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
19080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
19090 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
190a0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
190b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
190c0 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
190d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
190e0 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
190f0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
19100 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
19110 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
19120 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
19130 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
19140 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
19160 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19170 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
19180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19190 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
191a0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
191b0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
191c0 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
191d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
191e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
191f0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
19200 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
19210 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
19220 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
19230 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
19240 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
19250 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
19260 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
19270 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
19280 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
19290 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
192a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
192b0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
192c0 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
192d0 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
192e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
192f0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19310 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19320 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19330 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19340 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19350 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19360 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19370 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19380 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19390 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
193a0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
193b0 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
193c0 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
193d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
193e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
193f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19400 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
19410 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
19420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19440 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19450 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
19460 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
19470 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
19480 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
19490 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
194a0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
194b0 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
194c0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
194d0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
194e0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
194f0 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
19500 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
19510 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
19520 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
19530 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
19540 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
19550 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
19560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
19570 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
19580 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
19590 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
195a0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
195b0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
195c0 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
195d0 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
195e0 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
195f0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
19600 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
19610 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19620 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
19630 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
19640 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
19650 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
19660 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
19670 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
19680 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
19690 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
196a0 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  OR_SIZE..*/.stat
196b0 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
196c0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
196d0 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
196e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
196f0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
19700 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
19710 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
19720 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
19730 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
19740 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
19750 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
19760 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
19770 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
19780 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
19790 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
197a0 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
197b0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
197c0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
197d0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
197e0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
197f0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
19800 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
19810 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19820 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b  sectorSize<32 ){
19830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19840 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
19850 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
19860 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
19870 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
19880 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
19890 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
198a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
198b0 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f  ectorSize = MAX_
198c0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
198d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
198e0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
198f0 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
19900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19910 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
19920 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
19930 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
19940 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
19950 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
19960 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
19970 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
19980 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
19990 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
199a0 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
199b0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
199c0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
199d0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
199e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
199f0 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
19a00 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
19a10 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
19a20 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
19a30 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
19a40 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
19a50 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
19a60 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
19a70 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
19a80 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
19a90 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19aa0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19ab0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
19ac0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
19ad0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
19ae0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
19af0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
19b00 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19b10 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
19b20 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
19b30 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
19b40 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
19b50 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
19b60 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19b70 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
19b80 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
19b90 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
19ba0 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
19bb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
19bc0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
19bd0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19be0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
19bf0 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
19c00 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
19c10 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
19c20 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
19c30 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
19c40 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
19c50 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
19c60 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
19c70 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
19c80 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
19c90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19ca0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
19cb0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19cc0 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
19cd0 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
19ce0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
19cf0 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
19d00 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
19d10 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
19d20 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
19d30 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
19d40 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
19d50 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
19d60 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
19d70 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
19d80 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
19d90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19da0 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
19db0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
19dc0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
19dd0 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
19de0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
19df0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
19e00 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
19e10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
19e20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
19e30 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
19e40 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
19e50 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
19e60 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
19e70 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
19e80 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
19e90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19ea0 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
19eb0 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
19ec0 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
19ed0 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
19ee0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
19ef0 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
19f00 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
19f10 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
19f20 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
19f30 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
19f40 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
19f50 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
19f60 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
19f70 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
19f80 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
19f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
19fa0 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
19fb0 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
19fc0 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
19fd0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
19fe0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
19ff0 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1a000 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1a010 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1a020 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1a030 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1a040 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1a050 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1a060 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1a070 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1a080 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1a090 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1a0a0 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1a0b0 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1a0c0 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1a0d0 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1a0e0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1a0f0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1a100 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1a110 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1a120 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1a130 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1a140 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1a150 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1a160 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1a170 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1a180 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1a190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1a1a0 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1a1b0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1a1c0 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1a1d0 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1a1e0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1a1f0 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1a200 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1a210 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1a220 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1a230 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1a240 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1a250 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1a260 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1a270 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1a280 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1a290 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1a2a0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1a2b0 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1a2c0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1a2d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1a2e0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1a2f0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1a300 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1a310 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1a320 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1a330 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1a340 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1a350 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1a360 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1a370 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1a380 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1a390 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1a3a0 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1a3b0 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1a3c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1a3d0 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1a3e0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1a3f0 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1a400 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1a410 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1a420 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1a430 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1a440 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1a450 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1a460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a470 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1a490 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1a4a0 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1a4b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a4c0 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1a4d0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1a4e0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1a4f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1a500 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1a510 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1a520 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a530 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1a540 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1a550 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1a580 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1a590 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1a5a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1a5b0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1a5c0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1a5d0 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1a5e0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1a5f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1a600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a610 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1a620 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1a630 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1a640 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1a650 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1a660 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20  e rollback */.. 
1a670 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1a680 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1a690 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1a6a0 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1a6b0 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1a6c0 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1a6d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1a6e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1a6f0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1a700 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a710 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1a720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a730 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
1a740 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1a750 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1a760 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1a770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1a780 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1a790 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1a7a0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1a7b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a7c0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1a7d0 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1a7e0 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1a7f0 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1a800 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a810 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1a820 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1a830 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1a840 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1a850 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1a860 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1a870 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1a880 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1a890 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1a8a0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1a8b0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1a8c0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1a8d0 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1a8e0 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1a8f0 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1a900 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1a910 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1a920 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
1a930 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1a940 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1a950 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1a960 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1a970 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1a980 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1a990 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1a9a0 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1a9b0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1a9c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1a9d0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1a9e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1a9f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1aa00 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1aa10 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1aa20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1aa30 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1aa40 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1aa50 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1aa60 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1aa70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1aa80 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1aa90 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1aaa0 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1aab0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1aac0 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1aad0 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1aae0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1aaf0 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1ab00 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1ab10 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1ab20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1ab30 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1ab40 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1ab50 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1ab60 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1ab70 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1ab80 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1ab90 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1aba0 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1abb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1abc0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1abd0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1abe0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1abf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1ac00 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1ac10 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1ac20 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1ac30 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1ac40 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
1ac50 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1ac60 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1ac70 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1ac80 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1ac90 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1aca0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1acb0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1acc0 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1acd0 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1ace0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1acf0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1ad00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1ad10 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1ad20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ad30 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1ad40 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ad50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1ad60 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1ad70 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1ad80 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1ad90 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1ada0 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1adb0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1adc0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1add0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1ade0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1adf0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1ae00 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1ae10 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1ae20 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1ae30 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1ae40 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1ae50 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1ae60 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1ae70 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1ae80 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1ae90 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1aea0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1aeb0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1aec0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1aed0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1aee0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1aef0 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1af00 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1af10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1af20 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1af30 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1af40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1af50 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1af60 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1af70 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1af80 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1af90 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1afa0 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1afb0 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1afc0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1afd0 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1afe0 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1aff0 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1b000 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1b010 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1b020 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1b030 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1b040 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1b050 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1b060 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1b070 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1b080 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1b090 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1b0a0 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1b0b0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1b0c0 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1b0d0 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1b0e0 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1b0f0 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1b100 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1b110 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1b120 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1b130 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1b140 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1b150 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1b160 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1b170 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1b180 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1b190 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1b1a0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1b1b0 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1b1c0 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1b1d0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1b1e0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1b1f0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1b200 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1b210 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1b220 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1b230 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1b240 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1b250 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1b260 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1b270 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1b280 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1b290 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1b2a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1b2b0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1b2c0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1b2d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1b2e0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1b2f0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1b300 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1b310 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1b320 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1b330 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1b340 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1b350 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1b360 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1b370 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1b380 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1b390 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1b3a0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1b3b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1b3c0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1b3d0 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1b3e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b3f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b400 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b410 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1b420 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1b430 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1b440 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1b450 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1b460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1b470 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1b480 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1b490 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1b4a0 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1b4b0 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1b4c0 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1b4d0 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1b4e0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1b4f0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1b500 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1b510 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1b520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1b530 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1b540 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1b550 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1b560 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1b570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1b5a0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1b5b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b5c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1b5d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1b5e0 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
1b5f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1b600 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1b610 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1b620 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1b630 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1b640 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
1b650 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
1b660 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
1b670 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1b680 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
1b690 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
1b6a0 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
1b6b0 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
1b6c0 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
1b6d0 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
1b6e0 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
1b6f0 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
1b700 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1b710 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
1b720 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
1b730 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
1b740 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
1b750 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
1b760 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
1b770 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
1b780 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
1b790 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b7a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1b7b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1b7c0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1b7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b7e0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
1b7f0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1b800 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
1b810 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
1b820 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
1b830 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1b840 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
1b850 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
1b860 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
1b870 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
1b880 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
1b890 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
1b8a0 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
1b8b0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
1b8c0 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
1b8d0 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
1b8e0 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
1b8f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1b900 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1b910 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b920 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b930 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
1b940 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
1b950 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
1b960 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
1b970 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1b980 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1b990 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1b9a0 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1b9b0 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1b9c0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1b9d0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1b9e0 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1b9f0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1ba00 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1ba10 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1ba20 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1ba30 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1ba40 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1ba50 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1ba60 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1ba70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
1ba80 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
1ba90 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
1baa0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1bab0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
1bac0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1bad0 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
1bae0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
1baf0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1bb00 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1bb10 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1bb20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1bb30 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1bb40 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1bb50 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1bb60 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1bb70 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1bb80 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1bb90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1bba0 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1bbb0 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1bbc0 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1bbd0 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1bbe0 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1bbf0 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1bc00 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1bc10 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1bc20 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1bc30 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1bc40 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1bc50 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1bc60 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1bc70 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1bc80 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1bc90 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1bca0 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1bcb0 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1bcc0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1bcd0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1bce0 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1bcf0 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1bd00 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1bd10 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1bd20 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1bd30 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1bd40 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1bd50 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1bd60 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1bd70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bd80 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1bd90 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1bda0 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1bdb0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1bdc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1bdd0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1bde0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1bdf0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1be00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1be10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1be20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
1be30 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 0a 20 20  ager->noSync .  
1be40 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1be50 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1be60 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1be70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1be80 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1be90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1bea0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
1beb0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1bec0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
1bed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bee0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1bef0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1bf00 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1bf10 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73  !='\0');.    tes
1bf20 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1bf30 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1bf40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf50 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1bf60 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1bf70 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1bf80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1bf90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1bfa0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1bfb0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1bfc0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1bfd0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1bfe0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1bff0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1c000 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1c010 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1c020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1c030 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1c040 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1c050 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1c060 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1c070 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1c080 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1c090 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1c0a0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1c0b0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1c0c0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1c0d0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1c0e0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1c0f0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1c100 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1c110 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1c120 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1c130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1c140 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1c150 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1c160 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1c170 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1c180 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1c190 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1c1a0 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1c1b0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1c1c0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1c1d0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1c1e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1c1f0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1c200 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1c210 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1c220 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1c230 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1c240 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1c250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c260 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1c270 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1c280 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1c290 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1c2a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1c2b0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1c2c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1c2d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c2e0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1c2f0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1c300 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c310 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
1c320 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1c330 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
1c340 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
1c350 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
1c360 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1c370 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1c380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c3a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1c3b0 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20  t isInWal = 0;  
1c3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c3d0 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e  ue if page is in
1c3e0 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69   log file */.  i
1c3f0 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1c400 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1c410 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c420 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1c430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1c440 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1c450 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1c460 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1c470 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1c480 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f    if( NEVER(!isO
1c490 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
1c4a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c4b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1c4c0 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
1c4d0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
1c4e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c4f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c500 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1c510 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1c520 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
1c530 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1c540 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1c550 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1c560 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1c570 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72  e3WalRead(pPager
1c580 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
1c590 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50  sInWal, pgsz, pP
1c5a0 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20  g->pData);.  }. 
1c5b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c5c0 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29  OK && !isInWal )
1c5d0 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1c5e0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1c5f0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1c600 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1c610 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1c620 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1c630 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1c640 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c660 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c670 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c680 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c690 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1c6a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1c6b0 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1c6c0 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1c6d0 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1c6e0 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1c6f0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1c700 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1c710 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1c720 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1c730 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1c740 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1c750 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1c760 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1c770 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1c780 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1c790 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1c7a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1c7b0 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1c7c0 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1c7d0 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1c7e0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1c7f0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1c800 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1c810 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1c820 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1c830 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1c840 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1c850 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1c860 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1c870 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1c880 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1c890 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1c8a0 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1c8b0 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1c8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1c8d0 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1c8e0 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1c8f0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1c900 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75  hite noising equ
1c910 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f  aling 16 bytes o
1c920 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68  f 0xff is vanish
1c930 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20  ingly small so. 
1c940 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
1c950 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20  d still be ok.. 
1c960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65       */.      me
1c970 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46  mset(pPager->dbF
1c980 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73  ileVers, 0xff, s
1c990 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1c9a0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1c9b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
1c9c0 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
1c9d0 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
1c9e0 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [24];.      memc
1c9f0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1ca00 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1ca10 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
1ca20 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1ca30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44  .    }.  }.  COD
1ca40 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
1ca50 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
1ca60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ca70 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  EM);..  PAGER_IN
1ca80 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1ca90 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1caa0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1cab0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1cac0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1cad0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1cae0 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1caf0 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1cb00 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1cb10 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1cb20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1cb30 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1cb40 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1cb50 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1cb60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1cb70 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1cb80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cb90 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
1cba0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74   for each page t
1cbb0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1cbc0 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e  been .** written
1cbd0 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69   into the log fi
1cbe0 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72  le when a WAL tr
1cbf0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1cc00 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72  led back..** Par
1cc10 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68  ameter iPg is th
1cc20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1cc30 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20   said page. The 
1cc40 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a  pCtx argument .*
1cc50 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  * is actually a 
1cc60 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1cc70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a  ager structure..
1cc80 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50  **.** If page iP
1cc90 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  g is present in 
1cca0 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68  the cache, and h
1ccb0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1ccc0 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a  g references,.**
1ccd0 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64   it is discarded
1cce0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1ccf0 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
1cd00 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e   more outstandin
1cd10 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c  g.** references,
1cd20 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1cd30 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72  t is reloaded fr
1cd40 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1cd50 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d   If the.** attem
1cd60 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e  pt to reload con
1cd70 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1cd80 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72  tabase is requir
1cd90 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a  ed and fails, .*
1cda0 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  * return an SQLi
1cdb0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
1cdc0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1cdd0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1cde0 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  nt pagerUndoCall
1cdf0 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c  back(void *pCtx,
1ce00 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e   Pgno iPg){.  in
1ce10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ce20 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1ce30 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74  r = (Pager *)pCt
1ce40 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  x;.  PgHdr *pPg;
1ce50 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ..  pPg = sqlite
1ce60 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1ce70 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1ce80 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1ce90 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1cea0 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1ceb0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1cec0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1ced0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cee0 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1cef0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
1cf00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cf10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1cf20 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1cf30 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1cf40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1cf50 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  nref(pPg);.    }
1cf60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
1cf70 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61  lly, if a transa
1cf80 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1cf90 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70  back, any backup
1cfa0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20   processes are. 
1cfb0 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64   ** updated as d
1cfc0 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75  ata is copied ou
1cfd0 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  t of the rollbac
1cfe0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e  k journal and in
1cff0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
1d000 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  base. This is no
1d010 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73  t generally poss
1d020 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20  ible with a WAL 
1d030 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a  database, as.  *
1d040 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c  * rollback invol
1d050 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63  ves simply trunc
1d060 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  ating the log fi
1d070 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69  le. Therefore, i
1d080 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f  f one.  ** or mo
1d090 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61  re frames have a
1d0a0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1d0b0 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28  ten to the log (
1d0c0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20  and therefore . 
1d0d0 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20   ** also copied 
1d0e0 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20  into the backup 
1d0f0 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61  databases) as pa
1d100 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  rt of this trans
1d110 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
1d120 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65   backups must be
1d130 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f   restarted..  */
1d140 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
1d150 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
1d160 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74  pBackup);..  ret
1d170 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d180 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1d190 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
1d1a0 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1d1b0 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  on on a WAL data
1d1c0 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1d1d0 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
1d1e0 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  kWal(Pager *pPag
1d1f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d210 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1d220 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72   Code */.  PgHdr
1d230 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
1d240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1d250 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1d260 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a  s to revert */..
1d270 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67    /* For all pag
1d280 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
1d290 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
1d2a0 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65  ly dirty or have
1d2b0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
1d2c0 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20  en written (but 
1d2d0 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74  not committed) t
1d2e0 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  o the log file, 
1d2f0 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20  do one of the . 
1d300 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20   ** following:. 
1d310 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73   **.  **   + Dis
1d320 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20  card the cached 
1d330 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e  page (if refcoun
1d340 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  t==0), or.  **  
1d350 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63   + Reload page c
1d360 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1d370 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66  database (if ref
1d380 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20  count>0)..  */. 
1d390 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d3a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1d3b0 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1d3c0 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67  ite3WalUndo(pPag
1d3d0 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55  er->pWal, pagerU
1d3e0 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  ndoCallback, (vo
1d3f0 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20  id *)pPager);.  
1d400 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1d410 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1d420 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1d430 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1d440 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1d450 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1d460 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1d470 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1d480 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1d490 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1d4a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1d4b0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1d4c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1d4d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1d4e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1d4f0 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
1d500 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1d510 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
1d520 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
1d530 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
1d540 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
1d550 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
1d560 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
1d570 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1d580 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
1d590 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
1d5a0 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
1d5b0 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
1d5c0 68 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61  hanged. .*/ .sta
1d5d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1d5e0 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1d5f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1d600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1d610 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1d620 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d640 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1d650 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1d660 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d680 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1d690 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1d6a0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1d6b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1d6c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d6d0 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1d6e0 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66   */.  int sync_f
1d6f0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1d700 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1d710 6f 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63  o pass to OsSync
1d720 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a  () (or 0) */.){.
1d730 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d760 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1d770 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20  Pager->pWal );. 
1d780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1d790 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1d7a0 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67  Wal, .      pPag
1d7b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c  er->pageSize, pL
1d7c0 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20  ist, nTruncate, 
1d7d0 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66  isCommit, sync_f
1d7e0 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1d7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d800 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1d810 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1d820 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1d830 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1d840 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1d850 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1d860 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1d870 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1d880 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1d890 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d8a0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1d8b0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1d8c0 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1d8d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d8e0 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
1d8f0 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
1d900 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
1d910 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
1d920 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
1d930 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
1d940 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
1d950 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
1d960 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
1d970 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
1d980 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
1d990 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
1d9a0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
1d9b0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
1d9c0 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
1d9d0 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
1d9e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d9f0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1da00 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
1da10 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1da40 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
1da50 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
1da60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1da70 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
1da80 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
1da90 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1daa0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1dab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1dac0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1dad0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
1dae0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
1daf0 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
1db00 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1db10 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
1db20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
1db30 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
1db40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1db50 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
1db60 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
1db70 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
1db80 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
1db90 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
1dba0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
1dbb0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
1dbc0 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
1dbd0 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
1dbe0 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
1dbf0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1dc00 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1dc10 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1dc20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
1dc30 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1dc40 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1dc50 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
1dc60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc70 20 26 26 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   && changed ){. 
1dc80 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1dc90 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
1dca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1dcb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1dcc0 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1dcd0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
1dce0 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
1dcf0 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
1dd00 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
1dd10 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1dd20 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1dd30 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
1dd40 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
1dd50 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
1dd60 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1dd70 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
1dd80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
1dd90 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
1dda0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ddb0 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
1ddc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1ddd0 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
1dde0 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
1ddf0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
1de00 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
1de10 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
1de20 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
1de30 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1de40 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
1de50 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
1de60 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
1de70 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1de80 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
1de90 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1dec0 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1ded0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
1dee0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1def0 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
1df00 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
1df10 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
1df20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1df30 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
1df40 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
1df50 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
1df60 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
1df70 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1df80 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1df90 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1dfa0 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
1dfb0 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1dfc0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1dfd0 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
1dfe0 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
1dff0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
1e000 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
1e010 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
1e020 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1e030 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e040 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1e050 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1e060 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k>=SHARED_LOCK |
1e070 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  | pPager->noRead
1e080 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20  lock );.  nPage 
1e090 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
1e0a0 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
1e0b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
1e0c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1e0d0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1e0e0 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1e0f0 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74  system,.  ** det
1e100 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20  ermine it based 
1e110 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  on the size of t
1e120 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e130 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20  . If the size.  
1e140 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
1e150 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  se file is not a
1e160 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
1e170 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1e180 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20  ize,.  ** round 
1e190 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72  down to the near
1e1a0 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74  est page. Except
1e1b0 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65  , any file large
1e1c0 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79  r than 0.  ** by
1e1d0 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63  tes in size is c
1e1e0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e  onsidered to con
1e1f0 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tain at least on
1e200 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  e page..  */.  i
1e210 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1e220 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66   /* Size of db f
1e250 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1e260 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1e270 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1e280 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1e290 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
1e2a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1e2b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1e2c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1e2d0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
1e2e0 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20   &n);.      if( 
1e2f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e310 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1e320 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
1e330 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d  gno)(n / pPager-
1e340 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1e350 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
1e360 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  n>0 ){.      nPa
1e370 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge = 1;.    }.  
1e380 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
1e390 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
1e3a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1e3b0 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
1e3c0 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
1e3d0 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
1e3e0 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
1e3f0 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
1e400 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
1e410 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
1e420 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
1e430 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
1e440 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1e450 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1e460 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
1e470 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
1e480 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
1e490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1e4a0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
1e4b0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68  he *-wal file th
1e4c0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
1e4d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
1e4e0 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a  pened by pPager.
1e4f0 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65  ** exists if the
1e500 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1e510 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79   empy, or verify
1e520 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20   that the *-wal 
1e530 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
1e540 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74   exist (by delet
1e550 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64  ing it) if the d
1e560 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1e570 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
1e580 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1e590 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68  not empty and th
1e5a0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  e *-wal file exi
1e5b0 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61  sts, open the pa
1e5c0 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f  ger.** in WAL mo
1e5d0 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  de.  If the data
1e5e0 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72  base is empty or
1e5f0 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c   if no *-wal fil
1e600 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20  e exists and.** 
1e610 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
1e620 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
1e630 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
1e640 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a  is not set to.**
1e650 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1e660 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  DE_WAL..**.** Re
1e670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1e680 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  r an error code.
1e690 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1e6a0 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48  r must hold a SH
1e6b0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
1e6c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1e6d0 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66  o call this.** f
1e6e0 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65  unction. Because
1e6f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1e700 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  ck on the db fil
1e710 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
1e720 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41   delete .** a WA
1e730 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74  L on a none-empt
1e740 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73  y database, this
1e750 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69   ensures there i
1e760 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74  s no race condit
1e770 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ion .** between 
1e780 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65  the xAccess() be
1e790 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65  low and an xDele
1e7a0 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75  te() being execu
1e7b0 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20  ted by some .** 
1e7c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
1e7d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e7e0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
1e7f0 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  esent(Pager *pPa
1e800 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1e810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1e820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e830 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e850 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1e860 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  RED_LOCK || pPag
1e870 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1e880 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
1e890 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
1e8a0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
1e8d0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
1e8e0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64  /* Size of the d
1e910 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1e920 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
1e930 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1e940 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &nPage);.    if
1e950 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e960 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  ;.    if( nPage=
1e970 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1e980 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1e990 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
1e9a0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b  Pager->zWal, 0);
1e9b0 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
1e9c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e9d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1e9e0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
1e9f0 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
1ea00 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
1ea10 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1ea20 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
1ea30 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
1ea40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ea50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
1ea60 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
1ea70 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1ea80 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
1ea90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1eaa0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
1eab0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1eac0 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
1ead0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
1eae0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1eaf0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
1eb00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
1eb10 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1eb20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
1eb30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1eb40 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
1eb50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1eb60 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1eb70 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
1eb80 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
1eb90 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
1eba0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
1ebb0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
1ebc0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
1ebd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1ebe0 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
1ebf0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
1ec00 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
1ec10 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
1ec20 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
1ec30 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
1ec40 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
1ec50 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
1ec60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
1ec70 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
1ec80 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
1ec90 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
1eca0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
1ecb0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
1ecc0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
1ecd0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
1ece0 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
1ecf0 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
1ed00 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
1ed10 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
1ed20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
1ed30 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
1ed40 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1ed50 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
1ed60 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
1ed70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
1ed80 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
1ed90 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
1eda0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1edb0 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
1edc0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1edd0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
1ede0 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
1edf0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1ee00 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
1ee10 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
1ee20 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1ee30 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
1ee40 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
1ee50 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
1ee60 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
1ee70 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
1ee80 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
1ee90 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
1eea0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
1eeb0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
1eec0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1eed0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
1eee0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
1eef0 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
1ef00 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1ef10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
1ef20 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
1ef30 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
1ef40 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
1ef50 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
1ef60 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
1ef70 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
1ef80 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
1ef90 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
1efa0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
1efb0 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
1efc0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1efd0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
1efe0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
1eff0 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
1f000 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
1f010 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
1f020 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1f030 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
1f040 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
1f050 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
1f060 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
1f070 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
1f080 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
1f090 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
1f0a0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
1f0b0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
1f0c0 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
1f0d0 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
1f0e0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
1f0f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1f100 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
1f110 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
1f120 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1f130 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
1f140 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
1f150 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
1f160 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
1f170 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
1f180 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
1f190 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
1f1a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1f1b0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
1f1c0 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
1f1d0 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
1f1e0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
1f1f0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
1f200 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
1f210 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
1f220 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
1f230 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
1f240 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f250 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
1f260 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
1f270 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
1f280 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
1f290 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
1f2c0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
1f2d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
1f2e0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
1f2f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
1f300 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
1f310 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
1f320 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
1f330 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1f340 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1f350 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
1f360 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
1f370 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
1f380 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
1f390 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
1f3a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1f3b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1f3c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
1f3d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1f3e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1f3f0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
1f400 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
1f410 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
1f420 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
1f430 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
1f440 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
1f450 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
1f460 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
1f470 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
1f480 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
1f490 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
1f4a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f4b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1f4c0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1f4d0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f4e0 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
1f4f0 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
1f500 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
1f510 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
1f520 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
1f530 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1f540 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
1f550 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
1f560 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
1f570 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50  dbOrigSize;.  pP
1f580 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1f590 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1f5a0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1f5b0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
1f5c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f5d0 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
1f5e0 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
1f5f0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
1f600 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
1f610 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
1f620 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
1f630 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
1f640 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
1f650 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
1f660 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
1f670 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
1f680 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
1f690 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1f6a0 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
1f6b0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1f6c0 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
1f6d0 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
1f6e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
1f6f0 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
1f700 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
1f710 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1f720 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
1f730 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f740 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
1f750 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
1f760 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
1f770 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
1f780 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
1f790 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
1f7a0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
1f7b0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
1f7c0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
1f7d0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1f7e0 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
1f7f0 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
1f800 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
1f810 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
1f820 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
1f830 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1f840 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
1f850 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
1f860 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
1f870 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
1f880 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
1f890 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
1f8a0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
1f8b0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
1f8c0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
1f8d0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
1f8e0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
1f8f0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
1f900 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
1f910 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
1f920 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
1f930 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
1f940 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f950 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
1f960 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
1f970 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1f980 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1f990 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
1f9a0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
1f9b0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1f9c0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1f9d0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
1f9e0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
1f9f0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
1fa00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1fa10 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
1fa20 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
1fa30 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1fa40 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
1fa50 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
1fa60 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
1fa70 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1fa80 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
1fa90 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
1faa0 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
1fab0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
1fac0 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
1fad0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
1fae0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
1faf0 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
1fb00 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
1fb10 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
1fb20 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
1fb30 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
1fb40 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
1fb50 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
1fb60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1fb70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
1fb80 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
1fb90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
1fba0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1fbb0 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
1fbc0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
1fbd0 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
1fbe0 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
1fbf0 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
1fc00 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1fc10 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
1fc20 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
1fc30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1fc40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
1fc50 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
1fc60 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
1fc70 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1fc80 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1fc90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fca0 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
1fcb0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
1fcc0 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
1fcd0 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
1fce0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
1fcf0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
1fd00 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
1fd10 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1fd20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fd30 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
1fd40 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1fd50 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1fd60 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1fd70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fd80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
1fd90 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
1fda0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1fdb0 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
1fdc0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1fdd0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
1fde0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1fdf0 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
1fe00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fe10 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
1fe20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1fe30 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1fe40 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
1fe50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1fe60 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
1fe70 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
1fe80 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1fe90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1fea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1feb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fec0 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
1fed0 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
1fee0 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
1fef0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
1ff00 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
1ff10 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
1ff20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
1ff30 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1ff40 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
1ff50 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
1ff60 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
1ff70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
1ff80 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
1ff90 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
1ffa0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
1ffb0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
1ffc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1ffd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1ffe0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53   i64 offset = pS
1fff0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20000 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
20010 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
20020 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20030 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
20040 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
20050 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
20060 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
20070 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
20080 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20090 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
200a0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
200b0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
200c0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
200d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
200e0 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50  offset==ii*(4+pP
200f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
20100 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
20110 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20120 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
20130 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
20140 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
20150 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20160 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
20170 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
20180 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
20190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
201a0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
201b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
201c0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
201d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
201e0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
201f0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
20200 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
20210 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
20220 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
20230 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
20240 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
20250 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
20260 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
20270 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
20280 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
20290 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
202a0 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
202b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
202c0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
202d0 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
202e0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
202f0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
20300 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
20310 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
20320 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
20330 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
20340 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
20350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
20360 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
20370 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
20380 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
20390 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
203a0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
203b0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
203c0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
203d0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
203e0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
203f0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
20400 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
20410 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
20420 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
20430 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
20440 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
20450 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
20460 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
20470 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
20480 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
20490 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
204a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
204b0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
204c0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
204d0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
204e0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
204f0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
20500 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
20510 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
20520 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
20540 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
20550 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
20560 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
20570 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
20580 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
20590 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
205a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
205b0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
205c0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
205d0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
205e0 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
205f0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
20600 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
20610 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
20620 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
20630 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
20640 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
20650 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
20660 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
20670 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
20680 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
20690 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
206a0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
206b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
206c0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
206d0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
206e0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
206f0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
20700 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
20710 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
20720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
20730 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
20740 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
20750 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
20760 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
20770 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
20780 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
20790 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
207a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
207b0 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
207c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
207d0 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
207e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
207f0 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46  evel, int bFullF
20800 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
20810 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
20820 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
20830 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
20840 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
20850 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
20860 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
20870 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
20880 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
20890 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
208a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
208b0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
208c0 4c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  L);.}.#endif../*
208d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
208e0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
208f0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
20900 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
20910 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
20920 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
20930 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
20940 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
20950 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
20960 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
20970 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
20980 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
20990 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
209a0 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
209b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
209c0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
209d0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
209e0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
209f0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
20a00 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
20a10 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
20a20 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
20a30 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
20a40 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
20a50 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
20a60 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
20a70 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
20a80 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
20a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
20aa0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
20ab0 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
20ac0 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
20ad0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
20ae0 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
20af0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
20b00 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
20b10 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
20b20 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
20b30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
20b40 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
20b50 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
20b60 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
20b70 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
20b80 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
20b90 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
20ba0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
20bb0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
20bc0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
20bd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20be0 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
20bf0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
20c00 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
20c10 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
20c20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
20c30 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
20c40 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
20c50 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20c60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20c70 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
20c80 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
20c90 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
20ca0 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
20cb0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
20cc0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
20cd0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
20ce0 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
20cf0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
20d00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
20d10 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
20d20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
20d30 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
20d40 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
20d50 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
20d60 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
20d70 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
20d80 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
20d90 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
20da0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
20db0 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
20dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20dd0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
20de0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
20df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
20e00 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
20e10 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
20e20 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
20e30 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
20e40 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
20e50 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
20e60 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
20e70 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
20e80 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
20e90 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
20ea0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
20eb0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
20ec0 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
20ed0 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
20ee0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
20ef0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
20f00 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
20f10 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
20f20 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
20f30 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
20f40 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
20f50 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
20f60 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
20f70 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
20f80 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
20fb0 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
20fc0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
20fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
21000 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
21010 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
21020 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
21030 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
21040 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
21050 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
21060 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
21070 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
21080 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
21090 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
210a0 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
210b0 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
210c0 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
210d0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
210e0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
210f0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
21100 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
21110 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
21120 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
21130 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
21140 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
21150 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
21160 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21170 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
21180 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
21190 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
211b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
211c0 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
211d0 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
211e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
211f0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
21200 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
21210 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
21220 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
21230 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
21240 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
21250 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
21260 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
21270 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
21280 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
21290 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
212a0 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
212b0 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Arg;.}../*.** Ch
212c0 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
212d0 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
212e0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
212f0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
21300 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
21310 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
21320 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
21330 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
21340 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
21350 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21360 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
21370 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
21380 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
21390 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
213a0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
213b0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
213c0 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
213d0 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  UPT or SQLITE_FU
213e0 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
213f0 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
21400 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21410 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
21420 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
21430 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
21440 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
21450 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
21460 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
21470 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
21480 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
21490 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
214a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
214b0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
214c0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
214d0 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
214e0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
214f0 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
21500 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
21510 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
21520 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
21530 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
21540 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
21550 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
21560 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
21570 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
21580 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
21590 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
215a0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
215b0 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
215c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
215d0 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
215e0 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
215f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
21600 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
21610 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
21620 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
21630 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
21640 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
21650 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
21660 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
21670 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
21680 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
21690 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
216a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
216b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
216c0 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
216d0 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
216e0 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
216f0 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
21700 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
21710 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
21720 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
21730 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
21740 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
21750 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
21760 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
21770 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
21780 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
21790 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
217a0 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
217b0 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
217c0 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
217d0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
217e0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
217f0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21800 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
21810 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
21820 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21830 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
21840 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
21850 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
21860 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
21870 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
21880 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
21890 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
218a0 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
218b0 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
218c0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
218d0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
218e0 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
218f0 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
21900 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
21910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21920 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
21930 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
21940 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
21950 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
21960 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
21970 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
21980 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
21990 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
219a0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
219b0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
219c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
219d0 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
219e0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
219f0 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
21a00 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
21a10 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
21a20 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
21a30 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
21a40 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
21a50 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
21a60 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
21a70 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
21a80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
21a90 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
21aa0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
21ab0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21ac0 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
21ad0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
21ae0 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
21af0 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
21b00 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
21b10 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
21b20 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
21b30 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
21b40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21b50 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
21b60 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
21b70 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
21b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21b90 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
21ba0 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
21bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
21bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21bd0 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
21be0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
21bf0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
21c00 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
21c10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
21c20 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
21c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21c40 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
21c50 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
21c60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
21c70 69 7a 65 20 3d 20 6e 42 79 74 65 2f 70 61 67 65  ize = nByte/page
21c80 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
21c90 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
21ca0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
21cb0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
21cc0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
21cd0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
21ce0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
21cf0 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
21d00 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
21d10 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
21d20 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
21d30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
21d40 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
21d50 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
21d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21d70 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
21d80 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
21d90 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
21da0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
21db0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
21dc0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
21dd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
21de0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
21df0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
21e00 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
21e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21e20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
21e30 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21e40 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
21e50 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
21e60 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
21e70 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
21e80 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
21e90 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
21ea0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
21eb0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
21ec0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
21ed0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
21ee0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
21ef0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
21f00 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
21f10 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
21f20 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
21f30 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
21f40 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
21f50 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
21f60 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
21f70 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
21f80 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
21f90 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
21fa0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
21fb0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
21fc0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21fd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
21fe0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
21ff0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
22000 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
22010 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
22020 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
22030 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
22040 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
22050 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
22060 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
22070 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
22080 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
22090 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
220a0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
220b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
220c0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
220d0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
220e0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
220f0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
22100 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
22110 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
22120 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
22130 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
22140 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
22150 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
22160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
22170 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
22180 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
22190 2d 3e 6d 78 50 67 6e 6f 3c 70 50 61 67 65 72 2d  ->mxPgno<pPager-
221a0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70  >dbSize ){.    p
221b0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
221c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
221d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
221e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
221f0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
22200 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
22210 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
22220 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
22230 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
22240 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
22250 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
22260 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
22270 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
22280 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
22290 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
222a0 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
222b0 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
222c0 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
222d0 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
222e0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
222f0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
22300 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
22310 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22320 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
22330 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
22340 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
22350 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
22360 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
22370 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
22380 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
22390 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
223a0 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
223b0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
223c0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
223d0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
223e0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
223f0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
22400 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
22410 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
22420 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
22430 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
22440 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
22450 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
22460 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
22470 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
22480 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
22490 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
224a0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
224b0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
224c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
224d0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
224e0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
224f0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
22500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22510 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
22520 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
22530 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
22540 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
22550 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
22560 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
22570 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
22580 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
22590 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
225a0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
225b0 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
225c0 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
225d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
225e0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
225f0 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
22600 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
22610 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
22620 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
22630 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
22640 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
22650 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
22660 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
22670 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
22680 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
22690 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
226a0 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
226b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
226c0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
226d0 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
226e0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
226f0 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
22700 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
22710 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
22720 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
22730 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
22740 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
22750 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
22760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
22770 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
22780 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
22790 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
227a0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
227b0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
227c0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
227d0 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
227e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
227f0 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
22800 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
22810 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
22820 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
22830 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
22840 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
22850 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
22860 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
22870 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
22880 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
22890 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
228a0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
228b0 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
228c0 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
228d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
228e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
228f0 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
22900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
22910 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
22920 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22930 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
22940 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22950 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22960 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
22970 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  e called when a 
22980 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22990 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74   is open on.** t
229a0 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74  he pager. It ret
229b0 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
229c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
229d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
229e0 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
229f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
22a00 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
22a10 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
22a20 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
22a30 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
22a40 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
22a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22a60 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
22a70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22a80 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
22a90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
22aa0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
22ab0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
22ac0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
22ad0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
22ae0 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
22af0 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
22b00 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 72 65 74 75  ->dbSize;.  retu
22b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22b20 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
22b30 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
22b40 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
22b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22b60 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
22b70 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
22b80 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
22b90 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
22ba0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
22bb0 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
22bc0 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
22bd0 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
22be0 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
22bf0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
22c00 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
22c10 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
22c20 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
22c30 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
22c40 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
22c50 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
22c60 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
22c70 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
22c80 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
22c90 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
22ca0 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
22cb0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
22cc0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
22cd0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22ce0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
22cf0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
22d00 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
22d10 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
22d20 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
22d30 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
22d40 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
22d50 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
22d60 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
22d70 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
22d80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22d90 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
22da0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22db0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
22dc0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22df0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e */..  /* Check
22e00 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69   that this is ei
22e10 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65  ther a no-op (be
22e20 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73  cause the reques
22e30 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a  ted lock is .  *
22e40 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  * already held, 
22e50 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
22e60 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20  ansistions that 
22e70 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
22e80 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76  .  ** may be inv
22e90 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63  oked during, acc
22ea0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
22eb0 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a  mment above.  **
22ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22ed0 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20  Busyhandler().. 
22ee0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
22ef0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f  Pager->eLock>=lo
22f00 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c  cktype).       |
22f10 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
22f20 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  ==NO_LOCK && loc
22f30 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
22f40 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  CK).       || (p
22f50 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  Pager->eLock==RE
22f60 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c  SERVED_LOCK && l
22f70 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
22f80 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20  VE_LOCK).  );.. 
22f90 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70   do {.    rc = p
22fa0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
22fb0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  r, locktype);.  
22fc0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
22fd0 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
22fe0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
22ff0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
23000 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65  dlerArg) );.  re
23010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23020 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
23030 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
23040 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
23050 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
23060 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
23070 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
23080 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
23090 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
230a0 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
230b0 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
230c0 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
230d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
230e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
230f0 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
23100 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
23110 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
23120 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
23130 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
23140 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
23150 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
23160 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
23170 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
23180 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
23190 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
231a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
231b0 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
231c0 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
231d0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
231e0 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
231f0 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
23200 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
23210 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
23220 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
23230 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
23240 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
23250 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
23260 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
23270 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
23280 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
23290 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
232a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
232b0 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
232c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
232d0 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
232e0 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
232f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
23300 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
23310 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
23320 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20  behaviour would 
23330 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
23340 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
23350 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
23360 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
23370 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
23380 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
23390 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
233a0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
233b0 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
233c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
233d0 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
233e0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
233f0 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
23400 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
23410 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
23420 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
23430 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
23440 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
23450 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
23460 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
23470 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
23480 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
23490 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
234a0 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
234b0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
234c0 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
234d0 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
234e0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
234f0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
23500 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
23510 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
23520 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
23530 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
23540 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
23550 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
23560 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
23570 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
23580 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
23590 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
235a0 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
235b0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
235c0 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
235d0 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
235e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
235f0 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
23600 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
23610 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23620 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
23630 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
23640 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
23650 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
23660 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
23670 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
23680 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
23690 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
236a0 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
236b0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
236c0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
236d0 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
236e0 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
236f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23700 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
23710 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23720 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
23730 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23740 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
23750 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23760 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
23770 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23780 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
23790 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
237a0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
237b0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
237c0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
237d0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
237e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
237f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
23800 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
23810 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
23820 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
23830 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
23840 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
23850 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
23860 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
23870 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
23880 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
23890 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
238a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
238b0 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
238c0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
238d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
238e0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
238f0 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
23900 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
23910 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
23920 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
23930 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
23940 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
23950 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
23960 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
23970 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
23980 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
23990 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
239a0 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
239b0 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
239c0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
239d0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
239e0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
239f0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
23a00 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
23a10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23a20 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
23a30 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
23a40 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
23a50 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
23a60 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
23a70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
23a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23a90 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
23aa0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
23ab0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
23ac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
23ad0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23ae0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
23af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23b10 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23b20 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
23b30 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
23b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23b50 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
23b60 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
23b70 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
23b80 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
23b90 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
23ba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
23bb0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
23bc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23bd0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
23be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23bf0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
23c00 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
23c10 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
23c20 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
23c30 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
23c40 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
23c50 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
23c60 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
23c70 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
23c80 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
23c90 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
23ca0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
23cb0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
23cc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23cd0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
23ce0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
23cf0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
23d00 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
23d10 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
23d20 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
23d30 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
23d40 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
23d50 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
23d60 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
23d70 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
23d80 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
23d90 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
23da0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
23db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
23dc0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
23dd0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
23de0 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
23df0 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61  mpSpace;..  disa
23e00 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
23e10 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
23e20 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
23e30 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50  alloc();.  /* pP
23e40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
23e50 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
23e60 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
23e70 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
23e80 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
23e90 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
23ea0 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 28  ger->pWal,.    (
23eb0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
23ec0 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
23ed0 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20 70  c_flags), .    p
23ee0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
23ef0 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50 61   pTmp.  );.  pPa
23f00 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
23f10 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
23f20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
23f30 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
23f40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
23f50 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
23f60 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
23f70 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
23f80 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
23f90 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
23fa0 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
23fb0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
23fc0 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
23fd0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
23fe0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
23ff0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
24000 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
24010 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
24020 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
24030 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
24040 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
24050 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
24060 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
24070 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
24080 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
24090 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
240a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
240b0 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
240c0 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
240d0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
240e0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
240f0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
24100 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
24110 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
24120 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
24130 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
24140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
24150 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
24160 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
24170 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
24180 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
24190 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
241a0 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
241b0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
241c0 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
241d0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
241e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
241f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
24200 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
24210 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
24220 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
24230 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
24240 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
24250 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
24260 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
24270 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
24280 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
24290 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
242a0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
242b0 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
242c0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
242d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
242e0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
242f0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
24300 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
24310 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
24320 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
24330 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
24340 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
24350 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
24360 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
24370 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
24380 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
24390 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
243a0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
243b0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
243c0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
243d0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
243e0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
243f0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
24400 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
24410 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
24420 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
24430 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
24440 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
24450 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
24460 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
24470 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24480 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
24490 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
244a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
244b0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
244c0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
244d0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
244e0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
244f0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
24500 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
24510 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
24520 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24530 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
24540 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
24550 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
24560 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24570 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
24580 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
24590 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
245a0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
245b0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
245c0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
245d0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
245e0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
245f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
24600 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
24610 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
24620 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
24630 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
24640 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
24650 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
24660 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
24670 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
24680 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
24690 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
246a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
246b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
246c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
246d0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
246e0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
246f0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
24700 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
24710 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
24720 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
24730 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
24740 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
24750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
24760 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
24770 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
24780 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
24790 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
247a0 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
247b0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
247c0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
247d0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
247e0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
247f0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
24800 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
24810 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
24820 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
24830 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
24840 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
24850 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
24860 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
24870 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
24880 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
24890 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
248a0 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
248b0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
248c0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
248d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
248e0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
248f0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
24900 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
24910 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
24920 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
24930 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
24940 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
24950 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
24960 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
24970 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
24980 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
24990 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
249a0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
249b0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
249c0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
249d0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
249e0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
249f0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
24a00 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
24a10 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
24a20 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
24a30 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
24a40 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
24a50 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
24a60 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
24a70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
24a80 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
24a90 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
24aa0 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
24ab0 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
24ac0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
24ad0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
24ae0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
24af0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
24b00 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
24b10 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
24b20 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24b30 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
24b40 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
24b50 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
24b60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24b70 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
24b80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ba0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
24bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24bc0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
24bd0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
24be0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
24bf0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
24c00 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
24c10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
24c20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
24c30 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
24c40 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
24c50 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
24c60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24c70 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
24c80 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
24c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24ca0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
24cb0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
24cc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
24cd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24ce0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
24cf0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
24d00 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
24d10 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
24d20 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
24d30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
24d40 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
24d50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
24d60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
24d70 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
24d80 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
24d90 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
24da0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
24db0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
24dc0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
24dd0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
24de0 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
24df0 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
24e00 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
24e10 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
24e20 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
24e30 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
24e40 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
24e50 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
24e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
24e70 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
24e80 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
24e90 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
24ea0 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
24eb0 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
24ec0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
24ed0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
24ee0 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
24ef0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
24f00 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
24f10 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
24f20 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
24f30 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
24f40 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
24f50 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
24f60 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
24f70 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
24f80 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
24f90 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
24fa0 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
24fb0 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
24fc0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
24fd0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
24fe0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
24ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25000 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
25010 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
25020 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
25030 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
25040 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
25050 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
25060 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
25070 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
25080 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
25090 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
250a0 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
250b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
250c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
250d0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
250e0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
250f0 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
25100 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
25110 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
25120 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
25130 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
25140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25150 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
25160 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
25170 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
25180 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
25190 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
251a0 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
251b0 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
251c0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
251d0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
251e0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
251f0 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
25200 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
25210 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
25220 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
25230 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
25240 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
25250 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
25260 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
25270 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
25280 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
25290 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
252a0 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
252b0 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
252c0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
252d0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
252e0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
252f0 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
25300 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
25310 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
25320 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
25330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25340 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
25350 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
25360 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
25370 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
25380 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
25390 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
253a0 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
253b0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
253c0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
253d0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
253e0 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
253f0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
25400 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
25410 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
25420 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
25430 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
25440 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
25450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25460 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25470 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
25480 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
25490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
254a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
254b0 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
254c0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
254d0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
254e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
254f0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
25500 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
25510 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
25520 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
25530 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
25540 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
25550 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
25560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
25570 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
25580 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
25590 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
255a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
255b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
255c0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
255d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
255e0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
255f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
25600 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
25610 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
25620 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
25630 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
25640 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
25650 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
25660 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
25670 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
25680 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
25690 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
256a0 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
256b0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
256c0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
256d0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
256e0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
256f0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
25700 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
25710 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
25720 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
25730 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
25740 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
25750 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
25760 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
25770 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
25780 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
25790 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
257a0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
257b0 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
257c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
257d0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
257e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
257f0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
25800 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
25810 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
25820 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
25830 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
25840 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25850 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
25860 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
25870 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
25880 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
25890 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
258a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
258b0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
258c0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
258d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
258e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
258f0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
25900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
25940 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
25950 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
25960 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25970 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
25980 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
25990 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
259a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
259b0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
259c0 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
259d0 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
259e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
259f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25a10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
25a20 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
25a30 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
25a40 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
25a50 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
25a60 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
25a70 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
25a80 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
25a90 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
25aa0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
25ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
25ac0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
25ad0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
25ae0 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
25af0 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  (pPager->sync_fl
25b00 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
25b10 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
25b20 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
25b30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25b50 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
25b60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
25b70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25b80 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
25b90 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
25ba0 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
25bb0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
25bc0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
25bd0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
25be0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
25bf0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
25c00 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
25c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
25c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
25c30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
25c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25c60 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
25c70 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
25c80 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
25c90 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
25ca0 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
25cb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
25cc0 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
25cd0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
25ce0 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
25cf0 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
25d00 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
25d10 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
25d20 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
25d30 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
25d40 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
25d50 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
25d60 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
25d70 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
25d80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
25d90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
25da0 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
25db0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25dc0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
25dd0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
25de0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
25df0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
25e00 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
25e10 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
25e20 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
25e30 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
25e40 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
25e50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
25e60 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
25e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25e80 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
25e90 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
25ea0 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
25eb0 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
25ec0 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
25ed0 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
25ee0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
25ef0 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
25f00 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
25f10 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
25f20 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
25f30 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
25f40 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
25f50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25f60 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
25f70 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
25f80 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
25f90 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
25fa0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
25fb0 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
25fc0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
25fd0 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
25fe0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
25ff0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
26000 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
26010 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
26020 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
26030 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
26040 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
26050 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
26060 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
26070 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
26080 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
26090 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
260a0 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
260b0 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
260c0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
260d0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
260e0 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
260f0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
26100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26110 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
26120 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
26130 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
26140 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
26150 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
26160 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
26170 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
26180 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
26190 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
261a0 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
261b0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
261c0 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
261d0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
261e0 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
261f0 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
26200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26210 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
26220 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
26230 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
26240 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
26250 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
26260 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
26270 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
26280 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
26290 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
262a0 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
262b0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
262c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
262d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
262e0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
262f0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
26300 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
26310 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
26320 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
26330 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
26340 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
26350 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
26360 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
26370 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
26380 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
26390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
263a0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
263b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
263c0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
263d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
263e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
263f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26400 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
26410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26420 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
26430 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
26440 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
26450 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
26460 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
26470 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
26480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26490 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
264a0 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
264b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
264c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
264d0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
264e0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
264f0 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
26500 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
26510 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
26520 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
26530 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
26540 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
26550 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
26560 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
26570 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
26580 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
26590 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
265a0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
265b0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
265c0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
265d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
265e0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
265f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
26600 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
26610 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
26620 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
26630 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
26640 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
26650 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
26660 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
26670 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
26680 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
26690 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
266a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
266b0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
266c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
266d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
266e0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64  _OK && pPager->d
266f0 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  bSize>pPager->db
26700 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  HintSize ){.    
26710 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
26720 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
26730 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
26740 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
26750 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
26760 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
26770 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
26780 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
26790 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
267a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
267b0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
267c0 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
267d0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
267e0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
267f0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
26800 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
26810 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
26820 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
26830 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
26840 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
26850 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
26860 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
26870 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
26880 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
26890 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
268a0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
268b0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
268c0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
268d0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
268e0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
268f0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
26900 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
26910 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
26920 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
26930 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
26940 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
26950 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
26960 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
26970 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
26980 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
26990 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
269a0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
269b0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
269c0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
269d0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
269e0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
269f0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
26a00 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
26a10 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
26a20 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
26a30 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
26a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
26a70 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
26a80 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
26a90 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
26aa0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
26ab0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
26ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
26ad0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
26ae0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
26af0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
26b00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26b10 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
26b20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
26b30 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
26b40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26b50 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
26b60 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
26b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
26b80 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
26b90 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
26ba0 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
26bb0 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
26bc0 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
26bd0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
26be0 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
26bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26c00 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
26c10 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
26c20 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
26c30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
26c40 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
26c50 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
26c60 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
26c70 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
26c80 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
26c90 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
26ca0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
26cb0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
26cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26cd0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
26ce0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
26cf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26d00 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
26d10 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
26d20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
26d30 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
26d40 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
26d50 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
26d60 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
26d70 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
26d80 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
26d90 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
26da0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
26db0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
26dc0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
26dd0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
26e00 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
26e10 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
26e20 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
26e30 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
26e40 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
26e50 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
26e60 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
26e70 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
26e80 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
26e90 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
26ea0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26eb0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
26ec0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
26ed0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26ee0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
26ef0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
26f00 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
26f10 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
26f20 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
26f30 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
26f40 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
26f50 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
26f60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
26f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
26f80 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
26f90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
26fa0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
26fb0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
26fc0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
26fd0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
26fe0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26ff0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
27000 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
27010 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
27020 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
27030 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
27040 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
27050 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
27060 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
27070 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27080 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
27090 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
270a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
270b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
270c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
270d0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
270e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
270f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
27100 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
27110 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
27120 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
27130 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
27140 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
27150 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27160 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
27170 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
27180 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
27190 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
271a0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
271b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
271c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
271d0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
271e0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
271f0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
27200 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
27210 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
27220 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
27230 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
27240 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
27250 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
27260 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
27270 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
27280 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
27290 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
272a0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
272b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
272c0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
272d0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
272e0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
272f0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
27300 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
27310 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
27320 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
27330 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
27340 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
27350 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
27360 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
27370 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
27380 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
27390 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
273a0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
273b0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
273c0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
273d0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
273e0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
273f0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
27400 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
27410 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27420 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
27430 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27440 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
27450 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
27460 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
27470 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
27480 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
27490 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
274a0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
274b0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
274c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
274d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
274e0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
274f0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
27500 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
27510 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
27520 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27530 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
27540 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
27550 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
27560 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
27570 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
27580 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
27590 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
275a0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
275b0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
275c0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
275d0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
275e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
275f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
27600 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
27610 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
27620 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
27630 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
27640 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
27650 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
27660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
27680 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
27690 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
276a0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
276b0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
276c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
276d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
276e0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
276f0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
27700 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
27710 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
27720 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
27730 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
27740 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
27750 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
27760 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27770 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
27780 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
27790 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
277a0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
277b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
277c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
277d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
277e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
277f0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
27800 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
27810 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
27820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27830 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
27850 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
27860 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27870 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
27880 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
27890 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
278a0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
278b0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
278c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
278d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
278e0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
278f0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
27900 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
27910 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
27920 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
27930 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
27940 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
27950 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
27960 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
27970 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
27980 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
27990 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
279a0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
279b0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
279c0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
279d0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
279e0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
279f0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
27a00 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
27a10 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
27a20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
27a30 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
27a40 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
27a50 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
27a60 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
27a70 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
27a80 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
27a90 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
27aa0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
27ab0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
27ac0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
27ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27ae0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
27af0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
27b00 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
27b10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
27b20 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27b30 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
27b40 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
27b50 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
27b60 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
27b70 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
27b80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
27b90 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
27ba0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
27bb0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
27bc0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
27bd0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
27be0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
27bf0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
27c00 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
27c10 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
27c20 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
27c30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
27c40 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
27c50 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
27c60 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
27c70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27c80 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
27c90 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
27ca0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27cb0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
27cc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27cd0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
27ce0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
27cf0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
27d00 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
27d10 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
27d20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
27d30 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
27d40 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
27d50 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
27d60 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
27d70 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
27d80 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
27d90 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
27da0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
27db0 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
27dc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
27dd0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
27de0 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
27df0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
27e00 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
27e10 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
27e20 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
27e30 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
27e40 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
27e50 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
27e60 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
27e70 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
27e80 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
27e90 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
27ea0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
27eb0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
27ec0 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65 64 20   also inhibited 
27ed0 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
27ee0 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
27ef0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
27f00 64 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  de ) return SQLI
27f10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
27f20 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
27f30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27f40 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
27f50 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
27f60 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
27f70 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
27f80 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
27f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27fa0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
27fb0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
27fc0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
27fd0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
27fe0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
27ff0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
28000 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
28010 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
28020 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
28030 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
28040 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
28050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
28060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28070 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
28080 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
28090 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
280a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
280b0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
280c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
280d0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
280e0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
280f0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
28100 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
28110 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28120 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
28130 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
28140 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
28150 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
28160 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
28170 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
28180 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
28190 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
281a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
281b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
281c0 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
281d0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
281e0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
281f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
28200 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
28210 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
28220 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
28230 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
28240 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
28250 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
28260 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
28270 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
28280 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
28290 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
282a0 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
282b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
282c0 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
282d0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
282e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
282f0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
28300 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
28310 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
28320 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
28330 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
28340 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
28350 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
28360 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
28370 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
28380 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
28390 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
283a0 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
283b0 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
283c0 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
283d0 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
283e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
283f0 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
28400 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
28410 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
28420 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
28430 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
28440 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
28450 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
28460 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
28470 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
28480 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
28490 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
284a0 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
284b0 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
284c0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
284d0 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
284e0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
284f0 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
28500 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
28510 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
28520 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
28530 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
28540 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
28550 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
28560 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
28570 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
28580 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
28590 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
285a0 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
285b0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
285c0 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
285d0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
285e0 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
285f0 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
28600 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
28610 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
28620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
28630 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
28640 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
28650 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
28660 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
28670 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
28680 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
28690 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
286a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
286b0 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
286c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
286d0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
286e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
286f0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
28700 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
28710 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
28720 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28730 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
28740 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
28750 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
28760 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
28770 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
28780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28790 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
287a0 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
287b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
287c0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
287d0 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
287e0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
287f0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
28800 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
28810 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
28820 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
28830 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
28840 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
28850 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
28860 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
28870 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
28880 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
28890 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
288a0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
288b0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
288c0 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
288d0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
288e0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
288f0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
28900 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
28910 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
28920 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
28930 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
28940 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
28950 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
28960 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
28970 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
28980 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
28990 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
289a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
289b0 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
289c0 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
289d0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
289e0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
289f0 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
28a00 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
28a10 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
28a20 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
28a30 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
28a40 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
28a50 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
28a60 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
28a70 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
28a80 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
28a90 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
28aa0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
28ab0 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
28ac0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
28ad0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
28ae0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
28af0 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
28b00 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
28b10 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
28b20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
28b30 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
28b40 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
28b50 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
28b60 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
28b70 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
28b80 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
28b90 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
28ba0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
28bb0 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
28bc0 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
28bd0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
28be0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
28bf0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
28c00 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
28c10 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
28c20 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
28c30 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
28c40 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
28c50 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
28c60 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
28c70 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
28c80 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
28c90 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
28ca0 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
28cb0 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
28cc0 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
28cd0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
28ce0 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
28cf0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
28d00 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
28d10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
28d20 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
28d30 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
28d40 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
28d50 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
28d60 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
28d70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
28d80 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
28d90 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
28da0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
28db0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
28dc0 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
28dd0 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
28de0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
28df0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
28e00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28e10 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
28e20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
28e30 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
28e40 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
28e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28e60 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
28e70 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
28e80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28e90 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
28ea0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
28eb0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
28ec0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
28ed0 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
28ee0 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
28ef0 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
28f00 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
28f10 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f30 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
28f40 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
28f50 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
28f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
28f70 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
28f80 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
28f90 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
28fa0 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
28fb0 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
28fc0 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
28fd0 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
28fe0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
28ff0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
29000 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
29010 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
29020 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
29030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29040 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
29050 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
29060 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
29070 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29080 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
29090 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
290a0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
290b0 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
290c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
290d0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
290e0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
290f0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
29100 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29110 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
29120 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
29130 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
29140 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
29150 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
29160 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
29170 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
29180 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
29190 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
291a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
291b0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
291c0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
291d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
291e0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
291f0 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
29200 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
29210 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
29220 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
29230 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
29240 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
29250 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
29260 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
29270 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
29280 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
29290 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
292a0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
292b0 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
292c0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
292d0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
292e0 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
292f0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
29300 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
29310 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
29320 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
29330 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
29340 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
29350 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
29360 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
29370 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
29380 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
29390 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
293a0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
293b0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
293c0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
293d0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
293e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
293f0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
29400 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
29410 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
29420 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
29430 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
29440 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
29450 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
29460 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
29470 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
29480 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
29490 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
294a0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
294b0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
294c0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
294d0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
294e0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
294f0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
29500 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
29510 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
29520 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
29530 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
29540 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
29550 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
29560 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
29570 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29580 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
29590 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
295a0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
295b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
295c0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
295d0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
295e0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
295f0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
29600 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
29610 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
29620 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
29630 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
29640 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
29650 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
29660 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
29670 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
29680 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
29690 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
296a0 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
296b0 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
296c0 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
296d0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
296e0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
296f0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
29700 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
29710 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
29720 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
29730 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
29740 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
29750 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
29760 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29770 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
29780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29790 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
297a0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
297b0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
297c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
297d0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
297e0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
297f0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
29800 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
29810 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
29820 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
29830 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
29840 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
29850 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
29860 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
29870 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
29880 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
29890 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
298a0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
298b0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
298c0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
298d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
298e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
298f0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
29900 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
29910 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
29920 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
29930 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
29940 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
29950 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
29960 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
29970 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
29980 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29990 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
299a0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
299b0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
299c0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
299d0 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
299e0 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
299f0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
29a00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
29a10 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
29a20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
29a30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
29a40 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
29a50 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29a60 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
29a70 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
29a80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29a90 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
29aa0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
29ab0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29ac0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
29ad0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
29ae0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
29af0 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
29b00 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
29b10 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
29b20 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
29b30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29b40 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
29b50 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
29b60 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
29b70 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
29b80 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
29b90 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
29ba0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
29bb0 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
29bc0 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
29bd0 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
29be0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
29bf0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
29c00 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
29c10 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
29c20 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
29c30 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
29c40 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
29c50 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
29c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
29c70 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
29c80 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
29c90 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
29ca0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
29cb0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
29cc0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
29cd0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
29ce0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
29d00 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
29d10 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
29d20 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
29d30 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
29d40 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
29d50 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
29d60 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
29d70 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
29d80 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
29d90 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
29da0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
29db0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
29dc0 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
29dd0 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
29de0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
29df0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
29e00 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
29e10 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
29e20 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
29e30 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
29e40 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
29e50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
29e60 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
29e70 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
29e80 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
29e90 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
29ea0 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20  me + 8 + 1      
29eb0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
29ec0 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
29ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
29ee0 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
29ef0 20 34 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   4 + 1          
29f00 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
29f10 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
29f20 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
29f30 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
29f40 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
29f50 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
29f60 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
29f70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29f80 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
29f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29fa0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
29fb0 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
29fc0 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
29fd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
29fe0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
29ff0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2a000 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2a010 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2a020 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2a030 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2a040 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2a050 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2a060 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2a070 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2a080 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2a090 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2a0a0 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2a0b0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2a0c0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2a0d0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2a0e0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2a0f0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2a100 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2a110 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2a120 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2a130 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2a140 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2a150 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2a160 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2a170 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2a180 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2a190 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70  athname ){.    p
2a1a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2a1b0 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2a1c0 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2a1d0 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1);.    memcpy(p
2a1e0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2a1f0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a200 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2a210 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2a220 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2a230 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2a240 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2a250 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2a260 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
2a270 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 8);.    if( pP
2a280 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2a290 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0]==0 ){.      p
2a2a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2a2b0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  0] = 0;.    }.#i
2a2c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a2d0 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73 65 7b 0a  T_WAL.    else{.
2a2e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57        pPager->zW
2a2f0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2a300 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2a310 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  +8+1];.      mem
2a320 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2a330 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a340 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
2a350 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2a360 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
2a370 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "-wal", 4);.    
2a380 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
2a390 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2a3a0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2a3b0 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2a3c0 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2a3d0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2a3e0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2a3f0 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2a400 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2a410 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2a420 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  && !memDb ){.   
2a430 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2a460 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2a470 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2a480 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2a490 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2a4a0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2a4b0 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2a4c0 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  t);.    readOnly
2a4d0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2a4e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2a4f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2a500 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2a510 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2a520 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2a530 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2a540 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2a550 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2a560 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2a570 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2a580 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2a590 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2a5a0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2a5b0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2a5c0 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2a5d0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2a5e0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2a5f0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2a600 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2a610 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2a620 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2a630 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2a640 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2a650 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2a660 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a670 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2a680 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2a690 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2a6a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a6b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2a6c0 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2a6d0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a6e0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2a6f0 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2a700 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2a710 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2a720 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2a730 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2a740 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2a750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2a760 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2a770 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a780 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2a790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a7a0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2a7b0 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2a7c0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2a7d0 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2a7e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2a7f0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2a800 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2a810 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2a820 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2a830 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2a840 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2a850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a860 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2a870 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2a880 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2a890 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2a8a0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2a8b0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2a8c0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2a8d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a8e0 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2a8f0 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2a900 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2a910 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2a920 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2a930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a940 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2a950 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2a960 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2a970 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2a980 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2a990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a9a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2a9b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2a9c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2a9d0 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2a9e0 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2a9f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2aa00 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2aa10 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2aa20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2aa30 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2aa40 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2aa50 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2aa60 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2aa70 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2aa80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2aa90 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2aaa0 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2aab0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2aac0 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2aad0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2aae0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2aaf0 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2ab00 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2ab10 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2ab20 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2ab30 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2ab40 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2ab50 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2ab60 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2ab70 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2ab80 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2ab90 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2aba0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2abb0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2abc0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2abd0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2abe0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2abf0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2ac00 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2ac10 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2ac20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2ac30 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2ac40 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2ac50 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2ac60 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2ac70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac80 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2ac90 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2aca0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2acb0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2acc0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2acd0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2ace0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2acf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2ad00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2ad10 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2ad20 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2ad30 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2ad40 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2ad50 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2ad60 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2ad70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2ad80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad90 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2ada0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2adb0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2adc0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2add0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ade0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2adf0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2ae00 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2ae10 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2ae20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2ae30 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2ae40 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2ae50 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2ae60 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2ae70 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2ae80 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2ae90 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2aea0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2aeb0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2aec0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2aed0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2aee0 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2aef0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2af00 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2af10 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2af20 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2af30 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2af40 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2af50 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2af60 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2af70 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2af80 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
2af90 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
2afa0 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
2afb0 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
2afc0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2afd0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2afe0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2aff0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2b000 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2b010 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2b020 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2b030 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2b040 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2b050 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2b060 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2b070 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2b080 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2b090 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2b0a0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2b0b0 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2b0c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2b0d0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2b0e0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2b0f0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2b100 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2b110 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2b120 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2b130 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2b140 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2b150 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2b160 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b170 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2b180 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2b190 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2b1a0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2b1b0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2b1c0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2b1d0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2b1e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2b1f0 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2b200 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2b210 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2b220 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2b230 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2b240 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2b250 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2b260 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2b270 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2b280 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2b290 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2b2a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2b2b0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2b2c0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2b2d0 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2b2e0 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2b2f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
2b300 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2b310 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
2b320 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2b330 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2b340 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2b350 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2b360 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2b370 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2b380 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2b390 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2b3a0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2b3b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2b3c0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2b3d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2b3e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2b3f0 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2b400 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2b410 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2b420 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2b430 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b440 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2b450 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2b460 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2b470 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2b480 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2b490 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b4a0 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2b4b0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2b4c0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2b4d0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2b4e0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2b4f0 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2b500 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2b510 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2b520 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2b530 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2b540 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
2b550 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2b560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b570 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
2b580 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2b590 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2b5a0 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2b5b0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2b5c0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2b5d0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2b5e0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2b5f0 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2b600 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2b610 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2b620 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2b630 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2b640 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2b650 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2b660 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2b670 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2b680 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2b690 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2b6a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2b6b0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2b6c0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2b6d0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2b6e0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2b6f0 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2b700 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2b710 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2b720 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2b730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b740 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2b750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b760 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2b770 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2b780 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2b790 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2b7a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2b7b0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2b7c0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2b7d0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2b7e0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2b7f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2b800 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2b810 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2b820 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2b830 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2b840 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2b850 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2b860 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2b870 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2b880 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2b890 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2b8a0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2b8b0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2b8c0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2b8d0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2b8e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2b8f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2b900 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2b910 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2b920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2b930 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2b940 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2b950 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2b960 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2b970 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2b980 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2b990 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b9a0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2b9b0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2b9c0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2b9d0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2b9e0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2b9f0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2ba00 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2ba10 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2ba20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ba30 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2ba40 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2ba50 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2ba60 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2ba70 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2ba80 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2ba90 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2baa0 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2bab0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2bac0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2bad0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2bae0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2baf0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2bb00 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2bb10 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2bb20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2bb30 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2bb40 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2bb50 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2bb60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2bb70 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2bb80 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2bb90 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2bba0 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2bbb0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2bbc0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2bbd0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2bbe0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2bbf0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2bc00 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2bc10 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2bc20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2bc30 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bc40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2bc50 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2bc60 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2bc70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2bc80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2bc90 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2bca0 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2bcb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2bcc0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2bcd0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2bce0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2bcf0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2bd00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2bd10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2bd20 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2bd30 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2bd40 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2bd50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2bd60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2bd70 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2bd80 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2bd90 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2bda0 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2bdb0 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2bdc0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2bdd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2bde0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2bdf0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2be00 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2be10 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2be20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2be30 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2be40 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2be50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2be60 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2be70 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2be80 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2be90 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2bea0 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2beb0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2bec0 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2bed0 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2bee0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2bef0 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2bf00 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2bf10 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2bf20 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2bf30 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2bf40 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2bf50 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2bf60 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2bf70 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2bf80 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2bf90 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2bfa0 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2bfb0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2bfc0 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2bfd0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2bfe0 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2bff0 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2c000 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2c010 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2c020 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2c030 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2c040 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2c050 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2c060 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2c070 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2c080 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2c090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c0a0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2c0b0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2c0c0 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2c0d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c0e0 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2c0f0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c110 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c120 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2c130 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
2c140 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
2c150 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c160 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
2c170 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
2c180 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
2c190 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2c1a0 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
2c1b0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
2c1c0 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
2c1d0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
2c1e0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
2c1f0 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
2c200 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
2c210 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
2c220 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
2c230 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
2c240 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
2c250 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
2c260 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
2c270 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2c280 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2c290 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2c2a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c2b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c2c0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
2c2d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c2e0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2c2f0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2c300 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2c310 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2c320 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2c330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c340 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2c350 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2c360 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2c370 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 55            pagerU
2c380 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2c390 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2c3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c3b0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2c3c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2c3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c3e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2c3f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2c400 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2c410 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2c420 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2c430 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2c440 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2c450 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2c460 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2c470 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2c480 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2c490 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2c4a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2c4b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2c4c0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2c4d0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2c4e0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2c4f0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2c500 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2c510 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2c520 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2c530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c540 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2c550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2c560 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2c570 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2c580 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2c590 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2c5a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c5b0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2c5c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2c5d0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2c5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c5f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2c600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c610 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2c620 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2c630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c640 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2c650 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2c660 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2c670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c680 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2c690 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2c6a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c6b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2c6c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c6d0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2c6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c6f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2c700 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2c710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c720 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2c730 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2c740 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2c760 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2c770 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2c780 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2c790 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2c7a0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2c7b0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2c7c0 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2c7d0 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2c7e0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2c7f0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2c800 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2c810 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2c820 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2c830 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2c840 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2c850 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2c860 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2c870 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2c880 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2c890 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2c8a0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2c8b0 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2c8c0 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2c8d0 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2c8f0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2c900 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2c910 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2c920 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2c930 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2c940 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2c950 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2c960 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2c970 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2c980 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2c990 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2c9a0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2c9b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c9c0 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2c9d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c9e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ca00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ca10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ca20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2ca30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ca40 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2ca50 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2ca60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2ca70 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2ca80 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2ca90 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2caa0 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2cab0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2cac0 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2cad0 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2cae0 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2caf0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2cb00 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2cb10 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2cb20 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2cb30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2cb40 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2cb50 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2cb60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2cb70 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2cb80 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2cb90 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  ly in PAGER_UNLO
2cba0 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  CK state (no loc
2cbb0 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
2cbc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2cbd0 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
2cbe0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2cbf0 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
2cc00 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
2cc10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cc20 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
2cc30 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
2cc40 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
2cc50 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
2cc60 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
2cc70 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
2cc80 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
2cc90 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
2cca0 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
2ccb0 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
2ccc0 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
2ccd0 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
2cce0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ccf0 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
2cd00 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
2cd10 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
2cd20 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
2cd30 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
2cd40 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
2cd50 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
2cd60 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
2cd70 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
2cd80 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
2cd90 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2cda0 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
2cdb0 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
2cdc0 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
2cdd0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
2cde0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2cdf0 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
2ce00 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
2ce10 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
2ce20 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
2ce30 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2ce40 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
2ce50 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
2ce60 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
2ce70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2ce80 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
2ce90 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
2cea0 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
2ceb0 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
2cec0 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
2ced0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
2cee0 79 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e  y (2) above is n
2cef0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e  ot attempted, an
2cf00 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d if the.** page
2cf10 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
2cf20 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
2cf30 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68  n SQLITE_FULL wh
2cf40 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
2cf50 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
2cf60 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
2cf70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74   is returned. It
2cf80 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
2cf90 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74   read the.** dat
2cfa0 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51  abase when in SQ
2cfb0 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
2cfc0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  state..**.** Oth
2cfd0 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
2cfe0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2cff0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2d000 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2d010 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63  n.** IO error oc
2d020 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69  curs while locki
2d030 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
2d040 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20   checking for a 
2d050 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2d060 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  ile or rolling b
2d070 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
2d080 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
2d090 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d0a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d0b0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
2d0c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d0d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d0e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d0f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d100 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2d110 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2d120 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
2d130 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
2d140 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2d150 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
2d160 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
2d170 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
2d180 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
2d190 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
2d1a0 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
2d1b0 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
2d1c0 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2d1d0 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
2d1e0 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
2d1f0 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
2d200 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2d210 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2d220 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2d230 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
2d240 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2d250 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2d260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d270 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2d280 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
2d290 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2d2a0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
2d2b0 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
2d2c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d2d0 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
2d2e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
2d2f0 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
2d300 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
2d310 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2d320 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
2d330 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
2d340 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
2d350 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
2d360 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
2d370 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
2d380 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2d390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2d3a0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2d3b0 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  k==0 || pPager->
2d3c0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20  readOnly );..   
2d3d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
2d3e0 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  eadlock==0 ){.  
2d3f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2d400 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2d410 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2d420 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2d450 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
2d460 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
2d470 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
2d480 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CK );.        go
2d490 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2d4a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2d4b0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
2d4c0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
2d4d0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
2d4e0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
2d4f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2d500 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
2d510 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
2d520 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
2d530 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2d540 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2d550 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
2d560 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
2d570 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
2d580 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
2d590 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
2d5a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d5b0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2d5c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
2d5d0 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
2d5e0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
2d5f0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
2d600 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2d610 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
2d620 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
2d630 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
2d640 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
2d650 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
2d660 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
2d670 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2d680 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2d690 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
2d6a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2d6b0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
2d6c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d6d0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
2d6e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
2d6f0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
2d700 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2d710 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
2d720 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
2d730 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
2d740 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
2d750 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
2d760 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
2d770 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
2d780 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
2d790 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
2d7a0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
2d7b0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
2d7c0 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
2d7d0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
2d7e0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
2d7f0 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
2d800 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
2d810 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
2d820 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
2d830 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
2d840 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
2d850 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
2d860 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2d870 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2d880 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2d890 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
2d8a0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
2d8b0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
2d8c0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
2d8d0 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
2d8e0 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
2d8f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2d900 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d910 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
2d920 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
2d930 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2d940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2d960 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2d970 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
2d980 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2d990 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
2d9a0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
2d9b0 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
2d9c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2d9d0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2d9e0 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
2d9f0 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
2da00 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
2da10 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
2da20 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
2da30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2da40 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
2da50 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
2da60 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
2da70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
2da80 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
2da90 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
2daa0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
2dab0 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
2dac0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2dad0 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
2dae0 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
2daf0 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
2db00 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
2db10 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
2db20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
2db30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2db40 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2db50 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2db60 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
2db70 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
2db80 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
2db90 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
2dba0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
2dbb0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
2dbc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
2dbd0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
2dbe0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
2dbf0 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
2dc00 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
2dc10 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
2dc20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
2dc30 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
2dc40 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2dc50 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2dc60 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
2dc70 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
2dc80 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
2dc90 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
2dca0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2dcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2dcc0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2dcd0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2dce0 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
2dcf0 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
2dd00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2dd10 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
2dd20 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
2dd30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2dd40 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
2dd50 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2dd60 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2dd70 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2dd80 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
2dd90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dda0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
2ddb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2ddc0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
2ddd0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2dde0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2ddf0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2de00 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2de10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2de20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2de30 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2de40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2de50 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2de60 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2de70 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2de80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2de90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2dea0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2deb0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2dec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ded0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2dee0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2def0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2df00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2df10 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2df20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2df30 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2df40 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2df50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2df60 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2df70 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2df80 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2df90 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2dfa0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2dfb0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2dfc0 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2dfd0 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2dfe0 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2dff0 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2e000 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2e010 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2e020 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2e030 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2e040 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2e050 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2e060 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2e070 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2e080 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2e090 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2e0a0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2e0b0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2e0c0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2e0d0 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2e0e0 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2e0f0 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2e100 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2e110 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2e120 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2e130 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2e140 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2e150 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2e160 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2e170 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2e180 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2e190 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2e1a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2e1b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e1d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e1e0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2e1f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2e200 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2e210 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2e220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2e230 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e240 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2e250 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2e260 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2e270 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2e280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2e2a0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2e2b0 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2e2c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2e2d0 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2e2e0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2e2f0 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2e300 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2e310 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2e320 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2e330 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2e340 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2e350 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2e360 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2e370 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2e380 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2e390 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2e3a0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2e3b0 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2e3c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2e3d0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2e3e0 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2e3f0 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2e400 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2e410 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2e420 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2e430 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2e440 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e450 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2e460 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2e470 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2e480 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2e490 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2e4a0 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2e4b0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2e4c0 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2e4d0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2e4e0 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2e4f0 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2e500 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2e510 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2e520 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2e530 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2e540 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2e550 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2e560 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2e570 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2e580 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2e590 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2e5a0 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2e5b0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2e5c0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2e5d0 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2e5e0 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2e5f0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2e600 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2e610 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2e620 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2e630 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2e640 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2e650 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2e660 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e670 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2e680 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2e690 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2e6a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2e6b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2e6c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2e6d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2e6e0 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2e6f0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2e700 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2e710 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e720 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2e730 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2e740 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2e750 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2e760 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2e770 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2e780 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2e790 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2e7a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e7b0 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2e7c0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2e7d0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2e7e0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2e7f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e800 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2e810 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2e820 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2e830 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2e840 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2e850 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2e860 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2e870 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2e880 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2e890 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2e8a0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
2e8b0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
2e8c0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
2e8d0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
2e8e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
2e8f0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
2e900 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
2e910 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
2e920 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
2e930 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
2e940 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2e950 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
2e960 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
2e970 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
2e980 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
2e990 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
2e9a0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
2e9b0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
2e9c0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
2e9d0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
2e9e0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
2e9f0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
2ea00 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
2ea10 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
2ea20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
2ea30 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
2ea40 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
2ea50 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
2ea60 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
2ea70 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
2ea80 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
2ea90 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
2eaa0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
2eab0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2eac0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
2ead0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
2eae0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
2eaf0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2eb00 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
2eb10 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
2eb20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2eb30 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2eb40 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2eb50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
2eb60 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
2eb70 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
2eb80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
2eb90 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
2eba0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
2ebb0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
2ebc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ebd0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
2ebe0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
2ebf0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2ec00 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
2ec10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ec20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ec30 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2ec40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2ec50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
2ec60 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
2ec70 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
2ec80 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2ec90 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
2eca0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
2ecb0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
2ecc0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
2ecd0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
2ece0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
2ecf0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
2ed00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ed10 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
2ed20 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
2ed30 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
2ed40 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
2ed50 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
2ed60 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
2ed70 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
2ed80 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
2ed90 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
2eda0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
2edb0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
2edc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2edd0 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
2ede0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2edf0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
2ee00 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2ee10 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2ee20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ee30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
2ee40 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
2ee50 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
2ee60 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
2ee70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2ee80 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
2ee90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
2eea0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2eeb0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
2eec0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
2eed0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
2eee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2eef0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2ef00 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
2ef10 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
2ef20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ef30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2ef40 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
2ef50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
2ef60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2ef70 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  DER;.  }.  retur
2ef80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
2ef90 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
2efa0 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
2efb0 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
2efc0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
2efd0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
2efe0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
2eff0 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
2f000 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
2f010 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
2f020 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
2f030 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
2f040 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
2f050 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
2f060 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
2f070 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
2f080 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
2f090 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
2f0a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
2f0b0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
2f0c0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
2f0d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2f0e0 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61   if( (sqlite3Pca
2f0f0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2f100 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
2f110 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
2f120 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
2f130 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
2f140 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
2f150 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2f160 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
2f170 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
2f180 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
2f190 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
2f1a0 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
2f1b0 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
2f1c0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
2f1d0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
2f1e0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
2f1f0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
2f200 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
2f210 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
2f220 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
2f230 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
2f240 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
2f250 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
2f260 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
2f270 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
2f280 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
2f290 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
2f2a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2f2b0 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
2f2c0 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
2f2d0 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
2f2e0 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
2f2f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2f300 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
2f310 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
2f320 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
2f330 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
2f340 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
2f350 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
2f360 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
2f370 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
2f380 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
2f390 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
2f3a0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
2f3b0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
2f3c0 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
2f3d0 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
2f3e0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
2f3f0 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
2f400 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f410 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
2f420 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
2f430 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
2f440 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
2f450 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
2f460 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2f470 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
2f480 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
2f490 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
2f4a0 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
2f4b0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
2f4c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
2f4d0 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
2f4e0 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
2f4f0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
2f500 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
2f510 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
2f520 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
2f530 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
2f540 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
2f550 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
2f560 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
2f570 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
2f580 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
2f590 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
2f5a0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
2f5b0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
2f5c0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
2f5d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
2f5e0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
2f5f0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
2f600 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
2f610 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
2f620 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
2f630 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
2f640 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
2f650 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
2f660 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
2f670 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
2f680 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
2f690 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
2f6a0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
2f6b0 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
2f6c0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
2f6d0 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
2f6e0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
2f6f0 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
2f700 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
2f710 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
2f720 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
2f730 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
2f740 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
2f750 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
2f760 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
2f770 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
2f780 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
2f790 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
2f7a0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2f7b0 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
2f7c0 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
2f7d0 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
2f7e0 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
2f7f0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
2f800 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
2f810 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
2f820 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
2f830 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
2f840 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
2f850 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
2f860 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
2f870 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
2f880 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
2f890 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f8a0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
2f8b0 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
2f8c0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
2f8d0 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
2f8e0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
2f8f0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
2f900 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
2f910 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
2f920 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
2f930 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2f940 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2f950 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
2f960 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
2f970 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
2f980 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
2f990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
2f9a0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
2f9b0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
2f9c0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
2f9d0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
2f9e0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
2f9f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
2fa00 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
2fa10 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
2fa20 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
2fa30 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
2fa40 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
2fa50 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
2fa60 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
2fa70 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
2fa80 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
2fa90 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
2faa0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
2fab0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
2fac0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
2fad0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
2fae0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
2faf0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
2fb00 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
2fb10 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
2fb20 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
2fb30 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
2fb40 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
2fb50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2fb60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2fb70 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
2fb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2fb90 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
2fba0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2fbb0 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
2fbc0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
2fbd0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
2fbe0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2fbf0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2fc00 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
2fc10 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2fc20 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
2fc30 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
2fc40 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
2fc50 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
2fc60 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
2fc70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
2fc80 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
2fc90 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2fca0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2fcb0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  ger) );..  if( p
2fcc0 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
2fcd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2fce0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
2fcf0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
2fd00 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
2fd10 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61   state, return a
2fd20 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74  n error immediat
2fd30 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ely. .  ** Other
2fd40 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68  wise, request th
2fd50 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
2fd60 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f  PCache layer. */
2fd70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
2fd80 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
2fd90 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  K && pPager->err
2fda0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
2fdb0 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  L ){.    rc = pP
2fdc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2fdd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2fde0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2fdf0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
2fe00 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70  che, pgno, 1, pp
2fe10 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
2fe20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fe30 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
2fe40 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
2fe50 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2fe60 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
2fe70 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
2fe80 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
2fe90 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
2fea0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
2feb0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
2fec0 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
2fed0 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
2fee0 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
2fef0 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
2ff00 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
2ff10 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
2ff20 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
2ff30 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
2ff40 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
2ff50 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
2ff60 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50  age)->pPager==pP
2ff70 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65  ager || (*ppPage
2ff80 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  )->pPager==0 );.
2ff90 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
2ffa0 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
2ffb0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
2ffc0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2ffd0 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
2ffe0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
2fff0 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
30000 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
30010 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
30020 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
30030 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
30040 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
30050 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
30060 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
30070 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  ) );.    PAGER_I
30080 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
30090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
300a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
300b0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
300c0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
300d0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
300e0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
300f0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
30100 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
30110 2a 2f 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  */..    PAGER_IN
30120 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
30130 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
30140 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
30150 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
30160 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
30170 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
30180 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
30190 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
301a0 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
301b0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
301c0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
301d0 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
301e0 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
301f0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
30200 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
30210 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
30220 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
30230 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
30240 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
30250 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
30260 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
30270 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
30280 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
30290 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
302a0 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
302b0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
302c0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
302d0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
302e0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
302f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30300 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
30310 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
30320 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
30330 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
30340 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
30350 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
30360 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
30370 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
30380 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
30390 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
303a0 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
303b0 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
303c0 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
303d0 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
303e0 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
303f0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
30400 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
30410 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
30420 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
30430 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
30440 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
30450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30460 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
30470 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
30480 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
30490 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
304a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
304b0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
304c0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
304d0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
304e0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
304f0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
30500 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
30510 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
30520 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
30530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
30540 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
30550 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
30560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
30570 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
30580 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
30590 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
305a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
305b0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
305c0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
305d0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
305e0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
305f0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
30600 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
30610 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
30620 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
30630 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
30640 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
30650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30660 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
30670 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
30680 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
30690 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
306a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
306b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
306c0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
306d0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
306e0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
306f0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
30700 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
30710 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
30720 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
30730 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
30740 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
30750 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
30760 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
30770 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
30780 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
30790 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
307a0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
307b0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
307c0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
307d0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
307e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
307f0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
30800 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
30810 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
30820 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
30830 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
30840 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
30850 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
30860 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
30870 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
30880 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
30890 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
308a0 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
308b0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
308c0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
308d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
308e0 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
308f0 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
30900 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
30910 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
30920 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
30930 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
30940 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
30950 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
30960 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
30970 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30980 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
30990 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
309a0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
309b0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
309c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
309d0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
309e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
309f0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
30a00 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
30a10 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
30a20 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
30a30 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
30a40 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
30a50 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
30a60 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
30a70 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
30a80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
30a90 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
30aa0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
30ab0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
30ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30ad0 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
30ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30af0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
30b00 52 45 41 44 45 52 20 29 3b 0a 20 20 73 71 6c 69  READER );.  sqli
30b10 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
30b20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
30b30 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
30b40 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
30b50 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
30b60 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
30b70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
30b80 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
30b90 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
30ba0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
30bb0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
30bc0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
30bd0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
30be0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
30bf0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
30c00 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
30c10 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
30c20 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
30c30 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
30c40 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
30c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
30c60 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
30c70 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
30c80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
30c90 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
30ca0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
30cb0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
30cc0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
30cd0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
30ce0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
30cf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30d00 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
30d10 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
30d20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
30d30 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
30d40 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
30d50 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
30d60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30d70 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
30d80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30d90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
30da0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
30db0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
30dc0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
30dd0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
30de0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
30df0 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
30e00 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
30e10 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
30e20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
30e30 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
30e40 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
30e50 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
30e60 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
30e70 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
30e80 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
30e90 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
30ea0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
30eb0 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
30ec0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
30ed0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
30ee0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
30ef0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
30f00 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
30f10 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
30f20 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
30f30 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
30f40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
30f50 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
30f60 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
30f70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
30f80 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
30f90 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
30fa0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
30fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30fc0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
30fd0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
30fe0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30ff0 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
31000 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
31010 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
31020 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
31030 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
31040 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
31050 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
31060 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
31070 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
31080 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
31090 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
310a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
310b0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
310c0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
310d0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
310e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
310f0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
31100 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
31110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31120 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
31130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31140 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
31150 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
31160 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
31170 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
31180 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
31190 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
311a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
311b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
311c0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
311d0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
311e0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
311f0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
31200 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
31210 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
31220 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
31230 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31240 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
31250 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
31260 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
31270 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
31280 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
31290 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
312a0 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
312b0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
312c0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
312d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
312e0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
312f0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
31300 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
31310 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31320 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
31330 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31340 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
31350 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
31360 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
31370 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
31380 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
31390 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
313a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
313b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
313c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
313d0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
313e0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
313f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
31400 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
31410 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31420 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
31430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
31440 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31450 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
31460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
31470 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
31480 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
31490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
314a0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
314b0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
314c0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
314d0 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
314e0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
314f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
31500 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31510 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
31520 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
31530 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
31540 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
31550 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
31560 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
31570 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
31580 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
31590 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
315a0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
315b0 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  );.  #ifdef SQLI
315c0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
315d0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 72  _WRITE.        r
315e0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
315f0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
31600 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
31610 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31620 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
31630 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
31640 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 29  Pager).        )
31650 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20  ;.  #else.      
31660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31670 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31680 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31690 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
316a0 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
316b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
316c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
316d0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
316e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
316f0 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
31700 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
31710 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
31720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31730 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
31740 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
31750 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
31760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31780 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
31790 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
317a0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
317b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
317c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
317d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
317e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
317f0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
31800 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
31810 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
31820 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
31830 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
31840 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
31850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
31860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31870 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
31880 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
31890 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
318a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
318b0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
318c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
318d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
318e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
318f0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
31900 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
31910 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
31920 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
31930 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31940 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
31950 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
31960 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
31970 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
31980 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
31990 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
319a0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
319b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
319c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
319d0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
319e0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
319f0 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
31a00 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
31a10 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
31a20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
31a30 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
31a40 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
31a50 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
31a60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
31a70 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
31a80 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
31a90 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
31aa0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
31ab0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
31ac0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
31ad0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
31ae0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
31af0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
31b00 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
31b10 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
31b20 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
31b30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
31b40 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
31b50 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
31b60 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
31b70 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
31b80 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
31b90 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
31ba0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
31bb0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
31bc0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
31bd0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
31be0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
31bf0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
31c00 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
31c10 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
31c20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
31c30 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
31c40 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
31c50 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
31c60 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
31c70 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
31c80 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
31c90 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
31ca0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
31cb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
31cc0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
31cd0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
31ce0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31d00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
31d10 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 70 50  R_READER );.  pP
31d20 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
31d30 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
31d40 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
31d50 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
31d60 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
31d70 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
31d80 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
31d90 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
31da0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
31db0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
31dc0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
31dd0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
31de0 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
31df0 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
31e00 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
31e10 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
31e20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
31e30 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
31e40 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
31e50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31e60 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
31e70 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
31e80 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
31e90 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
31ea0 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
31eb0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
31ec0 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
31ed0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
31ee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31f00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31f20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
31f30 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
31f40 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  pWal, 1);.      
31f50 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62  }..      /* Grab
31f60 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
31f70 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  on the log file.
31f80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
31f90 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20  upgrade to.     
31fa0 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
31fb0 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  ED state. Otherw
31fc0 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
31fd0 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
31fe0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
31ff0 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  * The busy-handl
32000 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65  er is not invoke
32010 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e  d if another con
32020 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a  nection already.
32030 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74        ** holds t
32040 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49  he write-lock. I
32050 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
32060 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
32070 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20   call it..      
32080 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
32090 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69  lite3WalBeginWri
320a0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
320b0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
320c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
320d0 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
320e0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
320f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
32100 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
32110 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  meter.      ** i
32120 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
32130 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
32140 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
32150 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
32160 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61        ** busy-ha
32170 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63  ndler callback c
32180 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
32190 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65  upgrading to the
321a0 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20   EXCLUSIVE.     
321b0 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
321c0 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
321d0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
321e0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
321f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
32200 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
32210 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
32220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32230 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b  _OK && exFlag ){
32240 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
32250 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
32260 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
32270 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32280 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
32290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
322a0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67  {.      /* Chang
322b0 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b  e to WRITER_LOCK
322c0 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  ED state..      
322d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  **.      ** WAL 
322e0 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e  mode sets Pager.
322f0 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f  eState to PAGER_
32300 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72  WRITER_LOCKED or
32310 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20   CACHEMOD.      
32320 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61  ** when it has a
32330 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
32340 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f  on, but never to
32350 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48   DBMOD or FINISH
32360 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ED..      ** Thi
32370 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
32380 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65  those states the
32390 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61   code to roll ba
323a0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  ck savepoint .  
323b0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
323c0 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74  ons may copy dat
323d0 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  a from the sub-j
323e0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
323f0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
32400 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20  ** file as well 
32410 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  as into the page
32420 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f   cache. Which wo
32430 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74  uld be incorrect
32440 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41   in .      ** WA
32450 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
32460 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
32470 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
32480 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  ITER_LOCKED;.   
32490 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
324a0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
324b0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
324c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
324d0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
324e0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
324f0 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
32500 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
32510 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
32520 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
32530 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
32540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
32550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32560 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
32570 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
32580 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
32590 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
325a0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
325b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
325c0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
325d0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
325e0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
325f0 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
32600 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
32610 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ger)));.  return
32620 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
32630 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
32640 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
32650 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
32660 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
32670 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
32680 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
32690 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
326a0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
326b0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
326c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
326d0 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
326e0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
326f0 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
32700 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
32710 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
32720 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
32730 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
32740 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
32750 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
32760 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
32770 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
32780 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
32790 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
327a0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
327b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
327c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
327d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
327e0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
327f0 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
32800 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
32810 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
32820 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
32830 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
32840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
32850 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
32860 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
32870 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
32880 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
32890 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
328a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
328b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
328c0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
328d0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
328e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
328f0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
32900 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
32910 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32920 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
32930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
32940 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
32950 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
32960 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
32970 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
32980 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f  y detected, repo
32990 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rt the same erro
329a0 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68  r.  ** again. Th
329b0 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  is should not ha
329c0 70 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68  ppen, but the ch
329d0 65 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62  eck provides rob
329e0 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
329f0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
32a00 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
32a10 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
32a20 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
32a30 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
32a40 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
32a50 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
32a60 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
32a70 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
32a80 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
32a90 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
32aa0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
32ab0 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
32ac0 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
32ad0 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45  ITE_PERM;..  CHE
32ae0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
32af0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
32b00 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
32b10 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
32b20 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
32b30 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
32b40 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
32b50 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
32b60 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
32b70 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
32b80 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
32b90 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
32ba0 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
32bb0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
32bc0 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
32bd0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32be0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32bf0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
32c00 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
32c10 45 4d 4f 44 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  EMOD );.  }else{
32c20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
32c30 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
32c40 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
32c50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
32c60 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
32c70 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
32c80 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
32c90 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
32ca0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
32cb0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
32cc0 2a 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  * Higher level r
32cd0 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
32ce0 65 61 64 79 20 6f 62 74 61 69 6e 65 64 20 74 68  eady obtained th
32cf0 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
32d00 73 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 67 69  s.    ** to begi
32d10 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
32d20 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
32d30 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
32d40 6c 20 6d 69 67 68 74 20 6e 6f 74 20 0a 20 20 20  l might not .   
32d50 20 2a 2a 20 79 65 74 20 62 65 20 6f 70 65 6e 2e   ** yet be open.
32d60 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20   Open it now if 
32d70 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
32d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32d90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32da0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
32db0 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CKED ){.      rc
32dc0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
32dd0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
32de0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32df0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
32e00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
32e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32e20 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
32e30 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
32e40 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
32e50 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32e60 61 67 65 72 29 20 29 3b 0a 20 20 0a 20 20 20 20  ager) );.  .    
32e70 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
32e80 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
32e90 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
32ea0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
32eb0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
32ec0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32ed0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
32ee0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
32ef0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
32f00 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
32f10 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
32f20 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
32f30 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
32f40 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
32f50 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
32f60 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
32f70 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
32f80 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
32f90 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
32fa0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
32fb0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
32fc0 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
32fd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32fe0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
32ff0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
33000 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
33010 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
33020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
33030 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
33040 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
33050 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
33060 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
33070 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
33080 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
33090 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
330a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
330b0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
330c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
330d0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
330e0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
330f0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
33100 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
33110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33120 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
33130 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
33140 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
33150 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
33160 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
33170 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
33180 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
33190 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
331a0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
331b0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
331c0 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
331d0 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
331e0 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
331f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
33200 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
33210 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
33220 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
33230 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
33240 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
33250 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
33260 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
33270 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
33280 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
33290 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
332a0 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
332b0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
332c0 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
332d0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
332e0 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
332f0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
33300 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
33310 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
33320 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
33330 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
33340 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
33350 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
33360 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33370 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
33380 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
33390 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
333a0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
333b0 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
333c0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
333d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
333e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
333f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
33400 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
33410 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
33420 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
33430 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
33440 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33450 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
33460 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
33470 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
33480 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
33490 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
334a0 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
334b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
334c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
334d0 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
334e0 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
334f0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
33500 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
33530 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
33540 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
33550 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
33560 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
33570 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
33580 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
33590 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
335a0 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
335b0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
335c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
335d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
335e0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
335f0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
33600 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
33610 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
33620 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
33630 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
33640 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
33650 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
33660 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
33670 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
33680 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33690 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
336a0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
336b0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
336c0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
336d0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
336e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
336f0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
33700 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
33710 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33720 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
33730 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
33740 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
33750 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
33760 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
33770 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
33780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33790 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
337a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
337b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
337c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
337d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
337e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
337f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
33800 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
33810 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
33820 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
33830 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
33840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33850 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
33860 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
33870 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33890 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
338a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
338b0 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
338c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
338d0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
338e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
338f0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
33900 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
33910 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
33920 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
33930 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
33940 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
33950 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
33960 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
33970 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
33980 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
33990 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
339a0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
339b0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
339c0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
339d0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
339e0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
339f0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
33a00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
33a10 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
33a20 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
33a30 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
33a40 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
33a50 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
33a60 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
33a70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
33a80 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
33a90 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
33aa0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
33ab0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
33ac0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
33ad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
33ae0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
33af0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
33b00 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
33b10 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
33b20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
33b30 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
33b40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
33b50 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
33b60 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
33b70 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
33b80 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
33b90 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
33ba0 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
33bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
33bc0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
33bd0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
33be0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
33bf0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
33c00 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
33c10 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
33c20 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
33c30 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
33c40 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
33c50 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
33c60 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
33c70 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
33c80 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
33c90 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
33ca0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
33cb0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
33cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
33cd0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
33ce0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
33cf0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
33d00 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
33d10 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
33d20 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
33d30 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
33d40 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
33d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33d60 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
33d70 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
33d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33d90 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
33da0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
33db0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
33dc0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
33dd0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
33de0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
33df0 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
33e00 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
33e10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33e20 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
33e30 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
33e40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33e50 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
33e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33e70 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33e80 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
33e90 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
33ea0 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
33eb0 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
33ec0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
33ed0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
33ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
33ef0 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33f10 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
33f20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
33f30 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
33f40 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
33f50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
33f60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
33f70 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
33f80 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
33f90 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
33fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33fb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
33fc0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
33fd0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
33fe0 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
33ff0 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
34000 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
34010 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
34020 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f  yncSpill flag to
34030 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
34040 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
34050 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75  low.    ** a jou
34060 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
34070 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
34080 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
34090 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  naled by.    ** 
340a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
340b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
340c0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
340d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
340e0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
340f0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
34100 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b  >doNotSyncSpill+
34110 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  +;..    /* This 
34120 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
34130 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
34140 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
34150 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
34160 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
34170 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
34180 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
34190 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
341a0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
341b0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
341c0 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
341d0 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
341e0 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
341f0 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
34200 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
34210 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
34220 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64  ount = pPager->d
34230 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70  bSize;.    if( p
34240 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
34250 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
34260 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
34270 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
34280 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
34290 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
342a0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
342b0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
342c0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
342d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
342e0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
342f0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
34300 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
34310 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
34320 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
34330 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
34340 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
34350 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
34360 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
34370 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
34380 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
34390 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
343a0 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
343b0 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
343c0 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
343d0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
343e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
343f0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
34400 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
34410 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
34420 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
34430 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
34440 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
34450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
34460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
34480 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
34490 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
344a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
344b0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
344c0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
344d0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
344e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
344f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
34500 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
34510 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
34520 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
34530 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
34540 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
34550 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
34560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
34570 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
34580 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
34590 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
345a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
345b0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
345c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
345d0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
345e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
345f0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
34600 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
34610 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
34620 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
34630 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
34640 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
34650 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
34660 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
34670 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
34680 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
34690 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
346a0 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
346b0 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
346c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
346d0 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
346e0 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
346f0 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
34700 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
34710 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
34720 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
34730 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
34740 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
34750 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
34760 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
34770 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
34780 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
34790 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29   ii<nPage; ii++)
347a0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
347b0 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
347c0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
347d0 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
347e0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
347f0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61        pPage->fla
34800 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
34810 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
34820 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34830 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
34840 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34850 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
34860 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
34870 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  cSpill==1 );.   
34880 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
34890 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c  ncSpill--;.  }el
348a0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
348b0 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
348c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
348d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
348e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
348f0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
34900 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
34910 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
34920 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
34930 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
34940 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
34950 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
34960 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
34970 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
34980 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
34990 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
349a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
349b0 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
349c0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
349d0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
349e0 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
349f0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
34a00 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
34a10 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
34a20 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
34a30 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
34a40 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
34a50 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
34a60 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
34a70 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
34a80 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
34a90 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
34aa0 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
34ab0 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
34ac0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
34ad0 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
34ae0 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
34af0 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
34b00 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
34b10 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
34b20 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
34b30 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
34b40 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
34b50 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
34b60 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
34b70 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
34b80 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54  age is unused. T
34b90 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
34ba0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
34bb0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
34bc0 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
34bd0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
34be0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
34bf0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
34c00 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70  tion can quadrup
34c10 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
34c20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45  large .** DELETE
34c30 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
34c40 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
34c50 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72  rDontWrite(PgHdr
34c60 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
34c70 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
34c80 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50  Pager;.  if( (pP
34c90 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
34ca0 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d  IRTY) && pPager-
34cb0 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  >nSavepoint==0 )
34cc0 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
34cd0 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
34ce0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
34cf0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
34d00 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
34d10 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
34d20 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
34d30 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
34d40 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
34d50 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
34d60 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  TE;.#ifdef SQLIT
34d70 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
34d80 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
34d90 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
34da0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
34db0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
34dc0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
34dd0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
34de0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
34df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a  database file .*
34e00 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
34e10 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d  , stored as a 4-
34e20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
34e30 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67  integer starting
34e40 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66   at .** byte off
34e50 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61  set 24 of the pa
34e60 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ger file..**.** 
34e70 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  If the isDirectM
34e80 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ode flag is zero
34e90 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
34ea0 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
34eb0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
34ec0 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
34ed0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
34ee0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
34ef0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
34f00 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
34f10 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
34f20 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
34f30 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
34f40 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
34f50 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
34f60 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
34f70 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
34f80 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
34f90 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
34fa0 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
34fb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
34fc0 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
34fd0 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
34fe0 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73  s case,.** if is
34ff0 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65  Direct is non-ze
35000 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ro, then the dat
35010 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70  abase file is up
35020 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  dated directly.*
35030 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20  * by writing an 
35040 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20  updated version 
35050 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20  of page 1 using 
35060 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a  a call to the .*
35070 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  * sqlite3OsWrite
35080 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
35090 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
350a0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
350b0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
350c0 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d  r, int isDirectM
350d0 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
350e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
350f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35100 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35110 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
35120 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
35130 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35140 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
35150 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
35160 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
35170 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63  er) );..  /* Dec
35180 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
35190 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
351a0 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
351b0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
351c0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
351d0 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
351e0 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
351f0 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
35200 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
35210 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
35220 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
35230 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
35240 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
35250 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
35260 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
35270 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
35280 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
35290 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
352a0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
352b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
352c0 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
352d0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
352e0 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
352f0 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
35300 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
35310 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
35320 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
35330 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
35340 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
35350 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
35360 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
35370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
35380 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69  MIC_WRITE.# defi
35390 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30  ne DIRECT_MODE 0
353a0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
353b0 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ectMode==0 );.  
353c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
353d0 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a  (isDirectMode);.
353e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44  #else.# define D
353f0 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72  IRECT_MODE isDir
35400 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a  ectMode.#endif..
35410 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
35420 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
35430 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
35440 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
35450 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20  *pPgHdr;        
35460 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
35470 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
35480 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65  /.    u32 change
35490 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  _counter;       
354a0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
354b0 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63  alue of change-c
354c0 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a  ounter field */.
354d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
354e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
354f0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
35500 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  >fd) );..    /* 
35510 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
35520 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
35530 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
35540 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35550 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
35560 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Hdr);.    assert
35570 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72  ( pPgHdr==0 || r
35580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
35590 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20  .    /* If page 
355a0 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20  one was fetched 
355b0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e  successfully, an
355c0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
355d0 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70  is not.    ** op
355e0 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63  erating in direc
355f0 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67  t-mode, make pag
35600 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57  e 1 writable.  W
35610 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20  hen not in .    
35620 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  ** direct mode, 
35630 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79 73  page 1 is always
35640 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61   held in cache a
35650 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61 67  nd hence the Pag
35660 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61  erGet().    ** a
35670 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20 73  bove is always s
35680 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63  uccessful - henc
35690 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20  e the ALWAYS on 
356a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  rc==SQLITE_OK.. 
356b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44     */.    if( !D
356c0 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c  IRECT_MODE && AL
356d0 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f  WAYS(rc==SQLITE_
356e0 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OK) ){.      rc 
356f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35700 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ite(pPgHdr);.   
35710 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
35720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35730 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
35740 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
35750 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
35760 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
35770 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67  . */.      chang
35780 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
35790 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
357a0 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
357b0 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  ers);.      chan
357c0 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
357d0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
357e0 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
357f0 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
35800 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20  counter);..     
35810 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74   /* Also store t
35820 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  he SQLite versio
35830 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65  n number in byte
35840 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a  s 96..99 and in.
35850 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 39        ** bytes 9
35860 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
35870 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
35880 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
35890 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20 20  sion number.    
358a0 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
358b0 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  /.      put32bit
358c0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
358d0 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
358e0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
358f0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
35900 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
35910 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
35920 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
35930 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
35940 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
35950 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
35960 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
35970 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
35980 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52  */.      if( DIR
35990 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20  ECT_MODE ){.    
359a0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
359b0 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73  zBuf;.        as
359c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
359d0 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
359e0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
359f0 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61  ger, pPgHdr->pDa
35a00 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c  ta, 1, 6, rc=SQL
35a10 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29  ITE_NOMEM, zBuf)
35a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35a40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
35a50 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
35a60 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
35a70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
35a80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
35a90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
35aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35ab0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
35ac0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
35ad0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
35ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35af0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
35b00 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
35b10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
35b20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
35b30 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
35b40 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
35b50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
35b60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35b70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
35b80 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
35b90 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69   to disk. This i
35ba0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e  s a no-op for in
35bb0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a  -memory files.**
35bc0 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74   or pages with t
35bd0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
35be0 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
35bf0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
35c00 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  r called on a pa
35c10 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74  ger for which it
35c20 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69   is a no-op, thi
35c30 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
35c40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
35c50 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49   Otherwise, an I
35c60 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
35c70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
35c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
35c90 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
35ca0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35cd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
35ce0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
35cf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
35d00 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
35d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
35d20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
35d30 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
35d40 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
35d50 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
35d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35d70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
35d80 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
35d90 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77  called while a w
35da0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35db0 20 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a   is active in.**
35dc0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68   rollback. If th
35dd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
35de0 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69  in WAL mode, thi
35df0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
35e00 70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  p. .** Otherwise
35e10 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
35e20 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72  ion does not alr
35e30 65 61 64 79 20 68 61 76 65 20 61 6e 20 45 58 43  eady have an EXC
35e40 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a  LUSIVE lock on .
35e50 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
35e60 66 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 74  file, an attempt
35e70 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
35e80 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in one..**.** If
35e90 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
35ea0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
35eb0 65 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65 6d  eld or the attem
35ec0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 20  pt to obtain it 
35ed0 69 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  is.** successful
35ee0 2c 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63 74  , or the connect
35ef0 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ion is in WAL mo
35f00 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  de, SQLITE_OK is
35f10 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
35f20 68 65 72 77 69 73 65 2c 20 65 69 74 68 65 72 20  herwise, either 
35f30 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 61  SQLITE_BUSY or a
35f40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
35f50 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
35f60 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
35f70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
35f80 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
35f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
35fa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35fb0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
35fc0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35fd0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35fe0 48 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c  HEMOD .       ||
35ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36000 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
36010 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  MOD .       || p
36020 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36030 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
36040 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ED .  );.  asser
36050 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36060 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36070 0a 20 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55  .  if( 0==pagerU
36080 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
36090 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
360a0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
360b0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
360c0 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
360d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
360e0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
360f0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
36100 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
36110 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
36120 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
36130 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
36140 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
36150 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
36160 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
36170 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
36180 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
36190 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
361a0 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
361b0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
361c0 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
361d0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
361e0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
361f0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
36200 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  at:.**.**   * Th
36210 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36220 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
36230 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20  s updated,.**   
36240 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
36250 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20   synced (unless 
36260 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
36270 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36280 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61   used),.**   * a
36290 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
362a0 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
362b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
362c0 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74   .**   * the dat
362d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72  abase file is tr
362e0 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75  uncated (if requ
362f0 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  ired), and.**   
36300 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
36310 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a  ile synced. .**.
36320 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
36330 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  g that remains t
36340 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
36350 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66  nsaction is to f
36360 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c  inalize .** (del
36370 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72  ete, truncate or
36380 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
36390 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75  part of) the jou
363a0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a  rnal file (or .*
363b0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * delete the mas
363c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
363d0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
363e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
363f0 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
36400 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
36410 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
36420 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
36430 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
36440 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
36450 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
36460 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c  .** If the final
36470 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53   parameter - noS
36480 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74  ync - is true, t
36490 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
364a0 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20   file itself.** 
364b0 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54  is not synced. T
364c0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
364d0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
364e0 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20  Sync() directly 
364f0 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64  to.** sync the d
36500 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
36510 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d  ore calling Comm
36520 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20  itPhaseTwo() to 
36530 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  delete the.** jo
36540 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
36550 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
36560 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
36570 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61  itPhaseOne(.  Pa
36580 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
36590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
365a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
365b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
365c0 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20  Master,         
365d0 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
365e0 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  L, the master jo
365f0 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
36600 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20  int noSync      
36610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36620 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
36630 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65  the xSync on the
36640 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20   db file */.){. 
36650 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36660 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
36670 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
36680 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
36690 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
366a0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
366b0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
366c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
366d0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
366e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
366f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36700 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
36710 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
36720 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
36730 52 52 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73 65  RROR.  );.  asse
36740 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36750 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36760 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69  ;..  /* If a pri
36770 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  or error occurre
36780 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65  d, report that e
36790 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  rror again. */. 
367a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
367b0 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
367c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
367d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
367e0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
367f0 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
36800 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
36810 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
36820 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
36830 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
36840 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64  );..  /* If no d
36850 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
36860 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20  have been made, 
36870 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
36880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
36890 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
368a0 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65  ER_CACHEMOD ) re
368b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
368c0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
368d0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
368e0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
368f0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
36900 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
36910 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
36920 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
36930 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
36940 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
36950 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
36960 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
36970 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
36980 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
36990 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
369a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
369b0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
369c0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
369d0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61  else{.    if( pa
369e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
369f0 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  ) ){.      PgHdr
36a00 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
36a10 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
36a20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
36a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
36a40 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  st ){.        rc
36a50 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
36a60 73 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c  s(pPager, pList,
36a70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c   pPager->dbSize,
36a80 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   1, .           
36a90 20 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79   (pPager->fullSy
36aa0 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e  nc ? pPager->syn
36ab0 63 5f 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20  c_flags : 0).   
36ac0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
36ad0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36af0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36b00 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
36b10 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
36b20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36b30 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
36b40 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74  wing block updat
36b50 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
36b60 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68  unter. Exactly h
36b70 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64  ow it.      ** d
36b80 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73  oes this depends
36b90 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
36ba0 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  ot the atomic-up
36bb0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
36bc0 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65  n.      ** was e
36bd0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
36be0 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74  e time, and if t
36bf0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
36c00 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20  meets the .     
36c10 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74   ** runtime crit
36c20 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20  eria to use the 
36c30 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20  operation: .    
36c40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
36c50 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   * The file-syst
36c60 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
36c70 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
36c80 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20  perty for.      
36c90 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
36ca0 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
36cb0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  , and .      ** 
36cc0 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74     * This commit
36cd0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
36ce0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
36cf0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
36d00 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63      **    * Exac
36d10 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
36d20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
36d30 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
36d40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
36d50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36d60 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
36d70 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62  ion was not enab
36d80 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
36d90 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ime, then the.  
36da0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
36db0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36dc0 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  ) function is ca
36dd0 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  lled to update t
36de0 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20  he change.      
36df0 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69  ** counter in 'i
36e00 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49  ndirect-mode'. I
36e10 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
36e20 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  on is compiled i
36e30 6e 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69  n but.      ** i
36e40 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65  s not applicable
36e50 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63   to this transac
36e60 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  tion, call sqlit
36e70 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
36e80 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ).      ** to ma
36e90 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
36ea0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
36eb0 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
36ec0 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
36ed0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
36ee0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36ef0 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
36f00 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
36f10 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20  n indirect.     
36f20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20   ** mode. .     
36f30 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68   **.      ** Oth
36f40 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f  erwise, if the o
36f50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62  ptimization is b
36f60 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20  oth enabled and 
36f70 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20  applicable,.    
36f80 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70    ** then call p
36f90 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
36fa0 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
36fb0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
36fc0 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ounter.      ** 
36fd0 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65  in 'direct' mode
36fe0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
36ff0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37000 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20  will never be.  
37010 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
37020 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
37030 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
37040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
37050 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
37060 45 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  E.      PgHdr *p
37070 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Pg;.      assert
37080 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
37090 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
370a0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
370b0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
370c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
370d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
370e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
370f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37100 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
37110 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   );.      if( !z
37120 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
37130 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
37140 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
37150 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
37160 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
37170 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  er) .       && p
37180 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
37190 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
371a0 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d  e.       && (0==
371b0 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63  (pPg = sqlite3Pc
371c0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
371d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20  ager->pPCache)) 
371e0 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74  || 0==pPg->pDirt
371f0 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  y).      ){.    
37200 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
37210 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
37220 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65   counter via the
37230 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65   direct-write me
37240 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20  thod. The .     
37250 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
37260 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
37270 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
37280 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
37290 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
372a0 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74   ** to include t
372b0 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67  he updated chang
372c0 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
372d0 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
372e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65  .        ** dire
372f0 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
37300 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
37310 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
37320 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20  -write .        
37330 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
37340 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
37350 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
37360 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
37370 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
37380 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
37390 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
373a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
373b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
373c0 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
373d0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
373e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
373f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37400 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
37410 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
37420 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
37430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37440 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63    #else.      rc
37450 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
37460 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
37470 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66  er, 0);.  #endif
37480 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
37490 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
374a0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
374b0 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  _exit;.  .      
374c0 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
374d0 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
374e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
374f0 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
37500 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65  ages.      ** be
37510 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
37520 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
37530 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
37540 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
37550 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68       ** file. Th
37560 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
37570 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
37580 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a  m mode..      **
37590 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65  .      ** Before
375a0 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67   reading the pag
375b0 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
375c0 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e  bers larger than
375d0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
375e0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
375f0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65  Pager.dbSize, se
37600 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f  t dbSize back to
37610 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
37620 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b   ** that it took
37630 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
37640 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
37650 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
37660 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  .      ** calls 
37670 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
37680 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f  et() return zero
37690 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64  ed pages instead
376a0 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   of .      ** re
376b0 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20  ading data from 
376c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
376d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  e..      */.  #i
376e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
376f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
37700 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
37710 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
37720 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20  OrigSize .      
37730 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
37740 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
37750 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20  OURNALMODE_OFF. 
37760 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
37770 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20  Pgno i;         
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
377a0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
377b0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
377c0 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
377d0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
377e0 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c  r); /* Pending l
377f0 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ock page */.    
37800 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64      const Pgno d
37810 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
37820 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  dbSize;       /*
37830 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   Database image 
37840 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 20  size */ .       
37850 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
37860 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
37870 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  Size;.        fo
37880 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69  r( i=dbSize+1; i
37890 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
378a0 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
378b0 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
378c0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
378d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
378e0 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
378f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37900 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20  PgHdr *pPage;   
37910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37920 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e to journal */.
37930 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
37940 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
37950 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61  (pPager, i, &pPa
37960 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
37970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37980 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
37990 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
379a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
379b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
379c0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
379d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
379e0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
379f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
37a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37a10 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
37a20 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
37a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37a40 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
37a50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53  er->dbSize = dbS
37a60 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20  ize;.      } .  
37a70 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20 20  #endif.  .      
37a80 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
37a90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
37aa0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
37ab0 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73  l file. If a mas
37ac0 74 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ter .      ** jo
37ad0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
37ae0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
37af0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
37b00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20  journal file, . 
37b10 20 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d       ** or if zM
37b20 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e  aster is NULL (n
37b30 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
37b40 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  ), then this cal
37b50 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
37b60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
37b70 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
37b80 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
37b90 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
37ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37bb0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
37bc0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
37bd0 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68        /* Sync th
37be0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
37bf0 6e 64 20 77 72 69 74 65 20 61 6c 6c 20 64 69 72  nd write all dir
37c00 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
37c10 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
37c20 2a 2a 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63  ** If the atomic
37c30 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
37c40 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 75 73  tion is being us
37c50 65 64 2c 20 74 68 69 73 20 73 79 6e 63 20 77 69  ed, this sync wi
37c60 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a  ll not .      **
37c70 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
37c80 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
37c90 6f 72 6d 20 61 6e 79 20 72 65 61 6c 20 49 4f 2e  orm any real IO.
37ca0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
37cb0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 63  ** Because the c
37cc0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 70 61  hange-counter pa
37cd0 67 65 20 77 61 73 20 6a 75 73 74 20 6d 6f 64 69  ge was just modi
37ce0 66 69 65 64 2c 20 75 6e 6c 65 73 73 20 74 68 65  fied, unless the
37cf0 0a 20 20 20 20 20 20 2a 2a 20 61 74 6f 6d 69 63  .      ** atomic
37d00 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
37d10 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 74 20  tion is used it 
37d20 69 73 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  is almost certai
37d30 6e 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  n that the.     
37d40 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 72 65 71 75   ** journal requ
37d50 69 72 65 73 20 61 20 73 79 6e 63 20 68 65 72 65  ires a sync here
37d60 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 6c 6f  . However, in lo
37d70 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
37d80 73 69 76 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  sive.      ** on
37d90 20 61 20 73 79 73 74 65 6d 20 75 6e 64 65 72 20   a system under 
37da0 6d 65 6d 6f 72 79 20 70 72 65 73 73 75 72 65 20  memory pressure 
37db0 69 74 20 69 73 20 6a 75 73 74 20 70 6f 73 73 69  it is just possi
37dc0 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 73  ble that this is
37dd0 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74   .      ** not t
37de0 68 65 20 63 61 73 65 2e 20 49 6e 20 74 68 69 73  he case. In this
37df0 20 63 61 73 65 20 69 74 20 69 73 20 6c 69 6b 65   case it is like
37e00 6c 79 20 65 6e 6f 75 67 68 20 74 68 61 74 20 74  ly enough that t
37e10 68 65 20 72 65 64 75 6e 64 61 6e 74 0a 20 20 20  he redundant.   
37e20 20 20 20 2a 2a 20 78 53 79 6e 63 28 29 20 63 61     ** xSync() ca
37e30 6c 6c 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  ll will be chang
37e40 65 64 20 74 6f 20 61 20 6e 6f 2d 6f 70 20 62 79  ed to a no-op by
37e50 20 74 68 65 20 4f 53 20 61 6e 79 68 6f 77 2e 20   the OS anyhow. 
37e60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37e70 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
37e80 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
37e90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37ea0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
37eb0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
37ec0 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d  t;.  .      rc =
37ed0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
37ee0 65 6c 69 73 74 28 70 50 61 67 65 72 2c 73 71 6c  elist(pPager,sql
37ef0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
37f00 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
37f10 63 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  che));.      if(
37f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37f30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
37f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
37f50 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
37f60 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69        goto commi
37f70 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
37f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
37fa0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
37fb0 43 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20  Cache);.  .     
37fc0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
37fd0 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74  on disk is not t
37fe0 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
37ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
38000 67 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ge,.      ** the
38010 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e  n use pager_trun
38020 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20  cate to grow or 
38030 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20  shrink the file 
38040 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
38050 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
38060 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  >dbSize!=pPager-
38070 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
38080 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77         Pgno nNew
38090 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
380a0 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53  e - (pPager->dbS
380b0 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  ize==PAGER_MJ_PG
380c0 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  NO(pPager));.   
380d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
380e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
380f0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
38100 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
38110 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
38120 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20  Pager, nNew);.  
38130 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
38140 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
38150 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
38160 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
38170 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c  .      /* Finall
38180 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  y, sync the data
38190 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
381a0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
381b0 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
381c0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  nc ){.        rc
381d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
381e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
381f0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
38200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38210 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
38220 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
38230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d  .    }.  }..comm
38240 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
38250 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
38260 49 54 45 5f 4f 4b 20 26 26 20 21 70 61 67 65 72  ITE_OK && !pager
38270 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
38280 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
38290 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
382a0 54 45 52 5f 46 49 4e 49 53 48 45 44 3b 0a 20 20  TER_FINISHED;.  
382b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
382c0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  .../*.** When th
382d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
382e0 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62  alled, the datab
382f0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
38300 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20  n completely.** 
38310 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
38320 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  ct the changes m
38330 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65  ade by the curre
38340 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
38350 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20  nd.** synced to 
38360 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61  disk. The journa
38370 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  l file still exi
38380 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  sts in the file-
38390 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67  system .** thoug
383a0 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c  h, and if a fail
383b0 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68  ure occurs at th
383c0 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c  is point it will
383d0 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62   eventually.** b
383e0 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d  e used as a hot-
383f0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
38400 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
38410 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ion rolled back.
38420 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
38430 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74  tion finalizes t
38440 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
38450 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74   either by delet
38460 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74  ing, .** truncat
38470 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79  ing or partially
38480 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20   zeroing it, so 
38490 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62  that it cannot b
384a0 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68  e used .** for h
384b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
384c0 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69  ack. Once this i
384d0 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73  s done the trans
384e0 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72  action is.** irr
384f0 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74  evocably committ
38500 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
38510 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
38520 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
38530 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
38540 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65  he pager.** move
38550 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  s into the error
38560 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
38570 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
38580 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
38590 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
385a0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
385b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
385c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
385d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
385e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
385f0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
38600 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
38610 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ot be called if 
38620 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61  a prior error ha
38630 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a  s occurred..  **
38640 20 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20   But if (due to 
38650 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65  a coding error e
38660 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  lsewhere in the 
38670 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20  system) it does 
38680 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c  get.  ** called,
38690 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
386a0 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   same error code
386b0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
386c0 6e 79 74 68 69 6e 67 2e 2