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

Artifact 60c80db526d39286b913c824cf8303d34ab17a89:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  /.  int nHit, nM
7ff0: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
8000: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8010: 69 74 73 20 61 6e 64 20 6d 69 73 73 65 73 20 2a  its and misses *
8020: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8030: 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64  TEST.  int nRead
8040: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
8050: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
8060: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
8070: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
8080: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8090: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
80a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
80b0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
80c0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
80d0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
80e0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
80f0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8100: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8110: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8120: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8130: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8140: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8150: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8160: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8170: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8180: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8190: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
81a0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
81b0: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
81c0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
81e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
81f0: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8200: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8210: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8230: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8240: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8250: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8260: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8280: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8290: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
82a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
82b0: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
82e0: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
82f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8300: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8330: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8340: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8350: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8360: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
8370: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
8380: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
8390: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
83a0: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
83b0: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
83c0: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
83d0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
83e0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
83f0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
8400: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
8410: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
8420: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
8430: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
8440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8450: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
8460: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
8470: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
8480: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
8490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
84a0: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
84b0: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
84c0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
84d0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
84e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
84f0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
8500: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
8510: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
8520: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
8530: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8540: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
8550: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
8560: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
8570: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
8580: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
8590: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
85a0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
85b0: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
85c0: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
85d0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
85e0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
85f0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
8600: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
8610: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
8620: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
8630: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
8640: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
8650: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8660: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
8670: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
8680: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
8690: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
86a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
86b0: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
86c0: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
86d0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
86e0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
86f0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
8700: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
8710: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
8720: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
8730: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
8740: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
8750: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
8760: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
8770: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
8780: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
8790: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
87a0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
87b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
87c0: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
87d0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
87e0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
87f0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
8800: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
8810: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
8820: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
8830: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8840: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8850: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
8860: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
8870: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
8880: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8890: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
88a0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
88b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
88c0: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
88d0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
88e0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
88f0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
8900: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
8910: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
8920: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
8930: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
8940: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
8950: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
8960: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
8970: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
8980: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
8990: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
89a0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
89b0: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
89c0: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
89d0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
89e0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
89f0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
8a00: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
8a10: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
8a20: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
8a30: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
8a40: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
8a50: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
8a60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
8a70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
8a80: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
8a90: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
8aa0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
8ab0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
8ac0: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
8ad0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20   size of the of 
8ae0: 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64  each page record
8af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8b00: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74  is given by.** t
8b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
8b20: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ro..*/.#define J
8b30: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
8b40: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
8b50: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
8b60: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
8b70: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
8b80: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  r this pager. Th
8b90: 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
8ba0: 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20  e same .** size 
8bb0: 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  as a single disk
8bc0: 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73   sector. See als
8bd0: 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  o setSectorSize(
8be0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  )..*/.#define JO
8bf0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8c00: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
8c10: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
8c20: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
8c30: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
8c40: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
8c50: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8c60: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
8c70: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
8c80: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
8c90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8ca0: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
8cb0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
8cc0: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
8cd0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
8ce0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
8cf0: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
8d00: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
8d10: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
8d20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8d30: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
8d40: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
8d50: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
8d60: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
8d70: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
8d80: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
8d90: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
8da0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
8db0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
8dc0: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
8dd0: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
8de0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
8df0: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
8e00: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
8e10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
8e20: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
8e30: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
8e40: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
8e50: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
8e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
8e70: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
8e80: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
8e90: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
8ea0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
8eb0: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
8ec0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
8ed0: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
8ee0: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
8ef0: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
8f00: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
8f10: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
8f20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
8f30: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
8f40: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
8f50: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
8f60: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
8f70: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
8f80: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
8f90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
8fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
8fb0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
8fc0: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
8fd0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
8fe0: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
8ff0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9000: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9010: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9020: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
9030: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9040: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
9050: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
9060: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9070: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9080: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9090: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
90a0: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
90b0: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
90c0: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
90d0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
90e0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
90f0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9100: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9110: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9120: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9130: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9140: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9150: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9160: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9170: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9180: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9190: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
91a0: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
91b0: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
91c0: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
91d0: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
91e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
91f0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9200: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9210: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9240: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9250: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9260: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9270: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9280: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9290: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
92a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
92b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
92c0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
92e0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
92f0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9300: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9310: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9320: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9330: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9340: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9350: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9360: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9370: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9380: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9390: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
93a0: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
93b0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
93c0: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
93d0: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
93e0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
93f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9400: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9410: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9420: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9430: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9440: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9450: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9460: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9470: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9480: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
94a0: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
94b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
94c0: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
94d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
94e0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
94f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9500: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9510: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9520: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9530: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9540: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9550: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9560: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9570: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9580: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9590: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
95a0: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
95b0: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
95c0: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
95d0: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
95e0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
95f0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9610: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9620: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9630: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9640: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9650: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9660: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9670: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9680: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
96a0: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
96b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
96c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
96d0: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
96e0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
96f0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9700: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9710: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9720: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9730: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9750: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9760: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9770: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9780: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9790: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
97a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
97b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
97c0: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
97d0: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
97e0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
97f0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9800: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9810: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9820: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9830: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9840: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9850: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9860: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9870: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9880: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9890: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
98a0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
98b0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
98c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
98d0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
98e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
98f0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9900: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9910: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9920: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9930: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9950: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9960: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9970: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9980: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9990: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
99a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
99b0: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
99c0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
99d0: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
99f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9a00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9a10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9a20: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9a30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9a40: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9a50: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f  ED_LOCK || p->no
9a60: 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  Readlock );.    
9a70: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9a80: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9a90: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
9aa0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9ab0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ad0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ae0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9af0: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
9b00: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
9b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9b20: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9b30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
9b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70  Pager->dbSize==p
9b60: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b70: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9b80: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
9b90: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
9ba0: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
9bb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9bc0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
9bd0: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
9be0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9bf0: 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
9c00: 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ster==0 );.     
9c10: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9c20: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e PAGER_WRITER_C
9c30: 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61  ACHEMOD:.      a
9c40: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9c50: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c70: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9c90: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
9ca0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
9cb0: 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20         /* It is 
9cc0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66  possible that if
9cd0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
9ce0: 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74  l here that neit
9cf0: 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20  her the.        
9d00: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
9d10: 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nor the WAL file
9d20: 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20   are open. This 
9d30: 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20  happens during. 
9d40: 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c         ** a roll
9d50: 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
9d60: 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66   that switches f
9d70: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
9d80: 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  =off.        ** 
9d90: 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  to journal_mode=
9da0: 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wal..        */.
9db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9dc0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9dd0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9de0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9df0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9e00: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9e10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9e20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9e30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
9e40: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
9e50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9e60: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
9e70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e90: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
9ea0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
9eb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ec0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
9ed0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
9ee0: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
9ef0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9f00: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9f10: 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  DBMOD:.      ass
9f20: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
9f30: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9f40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f50: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9f70: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
9f80: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9f90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9fa0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55   p->eLock>=EXCLU
9fb0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9fc0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9fd0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9fe0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ff0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a000: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a020: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a030: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a040: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a060: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d  er->dbOrigSize<=
a070: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a080: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a090: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a0a0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
a0b0: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a0c0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a0d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a100: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a110: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a120: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a140: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a150: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a160: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a170: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a180: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a190: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a1a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a1b0: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a1c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1d0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52     case PAGER_ER
a1e0: 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68  ROR:.      /* Th
a1f0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
a200: 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
a210: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74  ding reference t
a220: 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20  o the pager if. 
a230: 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52       ** in ERROR
a240: 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
a250: 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75  e the pager shou
a260: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
a270: 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a  dropped.      **
a280: 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
a290: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2b0: 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
a2c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a2d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a2e0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a2f0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
a300: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a310: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
a320: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
a330: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
a340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a350: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
a360: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
a370: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
a380: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
a390: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
a3a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
a3b0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
a3c0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a3d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
a3e0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
a3f0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
a400: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
a410: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
a420: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
a430: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
a440: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
a450: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
a460: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
a470: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
a480: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
a490: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4a0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
a4b0: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
a4c0: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
a4d0: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
a4e0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
a4f0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
a500: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
a510: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
a520: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
a530: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
a540: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
a550: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
a560: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
a570: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
a580: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
a590: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
a5a0: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
a5b0: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
a5c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
a5d0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
a5e0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
a5f0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
a600: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
a610: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
a620: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
a630: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
a640: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
a650: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
a660: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
a670: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
a680: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
a690: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a6a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
a6b0: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
a6c0: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
a6d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6e0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
a6f0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
a700: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a720: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
a730: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
a740: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a750: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a760: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
a770: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
a780: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a790: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a7a0: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
a7b0: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
a7c0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a7d0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
a7e0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
a7f0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
a800: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
a810: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
a820: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
a830: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
a840: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
a850: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
a860: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
a870: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
a880: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a890: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
a8a0: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
a8b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
a8c0: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
a8d0: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
a8e0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
a8f0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
a900: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
a910: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
a920: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
a930: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
a940: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
a950: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a960: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
a970: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
a980: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
a990: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a9b0: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
a9c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
a9d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a9e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
a9f0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
aa00: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aa10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
aa20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
aa30: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
aa40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aa50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aa60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
aa70: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
aa80: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
aa90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aaa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
aab0: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
aac0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
aad0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
aae0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
aaf0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
ab00: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
ab20: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
ab30: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
ab40: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
ab50: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
ab60: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
ab70: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
ab80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ab90: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
aba0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
abb0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
abc0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
abd0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
abe0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
abf0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
ac00: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
ac10: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
ac20: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
ac30: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
ac40: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ac50: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
ac60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
ac70: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
ac80: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
ac90: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
aca0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
acb0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
acc0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
acd0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
ace0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
acf0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
ad00: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
ad10: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
ad20: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
ad30: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
ad40: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ad50: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
ad60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad70: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ad80: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
ad90: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
ada0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
adb0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
adc0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
add0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
ade0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
adf0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
ae00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
ae10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ae20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ae30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
ae40: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
ae50: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
ae60: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
ae70: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
ae80: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
ae90: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
aea0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
aeb0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
aec0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
aee0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
aef0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
af00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
af10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
af20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
af30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
af40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
af50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
af60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
af70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
af80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
af90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
afa0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
afb0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
afc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
afd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
afe0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
aff0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b000: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
b010: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
b020: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
b030: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
b040: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
b050: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
b060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b070: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
b080: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
b090: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b0a0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b0b0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b0c0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
b0d0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
b0e0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
b0f0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
b100: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
b110: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
b120: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
b130: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b140: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
b150: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b160: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b170: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
b180: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
b190: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b1a0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
b1b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
b1c0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
b1d0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
b1e0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
b1f0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
b200: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
b210: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b220: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
b230: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
b240: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
b250: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b260: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b270: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b280: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
b290: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
b2a0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
b2b0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b2c0: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
b2d0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
b2e0: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
b2f0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b300: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
b310: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
b320: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
b330: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
b340: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
b350: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
b360: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
b370: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b380: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
b390: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
b3a0: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
b3b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
b3c0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
b3d0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
b3e0: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
b3f0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b400: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b410: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b420: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b430: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
b440: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
b450: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
b460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
b480: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b490: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
b4a0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
b4b0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
b4c0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
b4d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
b4e0: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
b4f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
b500: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
b510: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  c = sqlite3OsUnl
b520: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
b530: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
b540: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
b550: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
b560: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
b570: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
b580: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
b590: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
b5a0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
b5b0: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
b5c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b5d0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b5e0: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b5f0: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b600: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
b610: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
b620: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
b630: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
b640: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
b650: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
b660: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
b670: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
b680: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b690: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
b6a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b6b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b6c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b6d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
b6e0: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b6f0: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
b700: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
b710: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
b720: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
b730: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b740: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b750: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
b760: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b770: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b790: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
b7a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b7b0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b7c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b7d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
b7e0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
b7f0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b800: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
b810: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
b820: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b830: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
b840: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
b850: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
b860: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
b870: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b880: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
b890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
b8a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
b8b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
b8c0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
b8d0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
b8e0: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
b8f0: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
b900: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
b910: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
b920: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
b930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b950: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
b960: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b970: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
b980: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
b990: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
b9a0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
b9b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
b9c0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
b9d0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
b9e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
b9f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
ba00: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
ba10: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
ba20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
ba30: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
ba40: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
ba50: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
ba60: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
ba70: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
ba80: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ba90: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
baa0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
bab0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
bac0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
bad0: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
bae0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
baf0: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
bb00: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
bb10: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
bb20: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
bb30: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
bb40: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
bb50: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
bb60: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
bb70: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
bb80: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
bb90: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
bba0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
bbb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bbc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
bbd0: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
bbe0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
bbf0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
bc00: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
bc10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
bc20: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
bc30: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
bc40: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
bc50: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
bc60: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
bc70: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
bc80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
bcb0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
bcc0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
bcd0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcf0: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
bd00: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
bd30: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
bd40: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
bd50: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
bd60: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
bd70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
bd80: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
bd90: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
bda0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
bdb0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
bdc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
bdd0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bde0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
bdf0: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
be00: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
be10: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
be20: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
be30: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
be40: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
be50: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
be60: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
be70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
be80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
be90: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
bea0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
beb0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
bec0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
bed0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
bee0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
bef0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
bf00: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
bf10: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
bf20: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
bf30: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
bf40: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
bf50: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
bf60: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
bf70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bf80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
bf90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
bfa0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
bfb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
bfc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
bfd0: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
bfe0: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
bff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c000: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c010: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c030: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c040: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c050: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c060: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c070: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c080: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c090: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c0a0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c0b0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c0c0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c0d0: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c0e0: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c0f0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c100: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c110: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c120: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c130: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c140: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c150: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c160: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c170: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c180: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c190: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c1a0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c1b0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c1c0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
c1d0: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
c1e0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
c1f0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
c200: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
c210: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
c220: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
c230: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c240: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
c250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
c260: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
c270: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
c280: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
c290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c2a0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
c2b0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
c2c0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
c2d0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
c2e0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
c2f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c300: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
c310: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
c320: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
c330: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
c340: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
c350: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
c360: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
c370: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
c380: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
c390: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
c3b0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
c3c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c3d0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
c3e0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
c3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
c400: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
c410: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c420: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
c430: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
c440: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
c450: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
c460: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
c470: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
c480: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
c490: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
c4a0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
c4b0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
c4c0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
c4d0: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
c4e0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
c4f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
c500: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
c510: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
c520: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
c530: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
c540: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
c550: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
c560: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
c570: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
c580: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
c590: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
c5a0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
c5b0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
c5c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c5d0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
c5e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c5f0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
c600: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
c610: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
c620: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
c630: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
c640: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
c650: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
c660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c670: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
c680: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
c690: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
c6a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c6b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c6c0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
c6e0: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
c6f0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
c700: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
c710: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
c720: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c730: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
c740: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
c750: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
c760: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
c770: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
c780: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
c790: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
c7a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c7b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c7c0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
c7d0: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
c7e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c7f0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
c800: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
c810: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
c820: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c830: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
c840: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c850: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c860: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
c870: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
c880: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
c890: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
c8a0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
c8b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c8c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c8d0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
c8e0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
c8f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
c900: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
c910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c920: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
c950: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
c960: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
c970: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c990: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
c9a0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
c9b0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
c9e0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
c9f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ca00: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
ca10: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
ca20: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
ca30: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
ca40: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
ca50: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ca60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ca70: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
ca80: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
ca90: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
caa0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
cab0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
cac0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
cad0: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
cae0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
caf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cb00: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
cb10: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
cb20: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cb30: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cb40: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
cb50: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
cb60: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cb70: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cb80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cb90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cba0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
cbb0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
cbc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
cbd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
cbe0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
cbf0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
cc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cc10: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
cc20: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
cc30: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
cc40: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
cc50: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
cc60: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
cc70: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
cc80: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
cc90: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
cca0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
ccb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ccd0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
cce0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
ccf0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
cd00: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
cd10: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
cd20: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
cd30: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
cd40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
cd50: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
cd60: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
cd70: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
cd80: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
cd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cda0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cdb0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cdc0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
cdd0: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
cde0: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
cdf0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
ce00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ce10: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
ce20: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
ce30: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ce40: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
ce50: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
ce60: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
ce70: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
ce80: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
ce90: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
cea0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
cef0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
cf00: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
cf10: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cf30: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
cf60: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
cf70: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
cf80: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
cf90: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
cfa0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
cfb0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
cfc0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
cfd0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
cfe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cff0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d000: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d010: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d020: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d030: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d040: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d050: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d060: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d070: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d080: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d090: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d0b0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d0c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d0d0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d0e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d0f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d110: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d120: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d130: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d140: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d150: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d160: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d170: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d180: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d190: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d1a0: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d1b0: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d1c0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d1d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d1e0: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d1f0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d200: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d210: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d220: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d230: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d240: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d250: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d260: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d270: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d280: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d290: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d2a0: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d2b0: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d2c0: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d2d0: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d2e0: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d2f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d300: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d310: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d320: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d330: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d340: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d360: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d370: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d380: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d390: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d3a0: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d3b0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d3c0: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d3d0: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d3e0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d3f0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d400: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d410: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d420: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d430: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d440: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d450: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d460: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d470: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d480: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d490: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d4a0: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d4b0: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d4c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d4f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d500: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d510: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d520: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d530: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d540: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d560: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d570: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d580: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
d590: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
d5a0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
d5b0: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
d5c0: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
d5d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d5e0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d5f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
d600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d610: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
d620: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
d630: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
d640: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d650: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
d660: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
d670: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
d680: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d690: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
d6a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
d6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d6c0: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
d6d0: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
d6e0: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
d6f0: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
d700: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
d710: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
d720: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
d730: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
d740: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
d750: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
d760: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
d770: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
d780: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
d790: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
d7a0: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
d7b0: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
d7c0: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
d7d0: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
d7e0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
d7f0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
d800: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
d810: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
d820: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
d830: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
d840: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
d850: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
d860: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
d870: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
d880: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
d890: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
d8a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d8b0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
d8c0: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
d8d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d8e0: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
d8f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d900: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d910: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
d920: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
d930: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
d940: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
d950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
d960: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
d970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d980: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
d990: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
d9a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
d9b0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
d9c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
d9d0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
d9e0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
d9f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
da00: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
da10: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
da20: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
da30: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
da40: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
da50: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
da60: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
da70: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
da80: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
da90: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
daa0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
dab0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
dac0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
dad0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
dae0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
daf0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
db00: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
db10: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
db20: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
db30: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
db40: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
db50: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
db60: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
db70: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
db80: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
db90: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
dba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
dbb0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
dbc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
dbd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dbe0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dbf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
dc00: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
dc10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
dc20: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
dc30: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
dc40: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
dc50: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
dc60: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
dc70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
dc80: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
dc90: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
dca0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
dcb0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
dce0: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
dcf0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
dd30: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
dd40: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
dd50: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
dd60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
dd70: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
dd80: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
dd90: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
dda0: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
ddb0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ddc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
ddd0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
dde0: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
ddf0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
de00: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
de10: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
de20: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
de30: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
de40: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
de50: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
de60: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
de70: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
de80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
de90: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
dea0: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
deb0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dec0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
dee0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
def0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
df00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df10: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
df20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
df30: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
df40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
df50: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
df60: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
df70: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
df80: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
df90: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
dfa0: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
dfb0: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
dfc0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
dfd0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
dfe0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
dff0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e000: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e010: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e020: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e030: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e040: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e050: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e060: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e070: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e080: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e090: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e0a0: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e0b0: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e0c0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e0d0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e0e0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e0f0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e100: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e110: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e120: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e130: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e140: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e150: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e160: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e170: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e180: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e190: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e1a0: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e1b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e1c0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e1d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e1e0: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e1f0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e200: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e210: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e220: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e230: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e240: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e250: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e260: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e270: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e280: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e290: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e2a0: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e2b0: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e2c0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e2d0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e2e0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e2f0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e300: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e310: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e320: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e330: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e340: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e370: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e380: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e390: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
e3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
e3b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
e3c0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
e3d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
e3e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e3f0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
e400: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e410: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
e420: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
e430: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
e440: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e450: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
e460: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e480: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
e490: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
e4a0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
e4b0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
e4c0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
e4d0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
e4e0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
e4f0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
e500: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
e510: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
e520: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
e530: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e540: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
e550: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e560: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
e570: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
e580: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
e590: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
e5a0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
e5b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e5c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e5d0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
e5e0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
e5f0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
e600: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
e610: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
e620: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e630: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e640: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
e650: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
e660: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
e670: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
e680: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e690: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e6a0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
e6b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
e6c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
e6d0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
e6e0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
e6f0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
e700: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
e710: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
e720: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
e730: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
e740: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
e750: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
e760: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
e770: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
e780: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
e790: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
e7a0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
e7b0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
e7c0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
e7d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e7e0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
e7f0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
e800: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e810: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
e820: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
e830: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
e840: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
e850: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
e860: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
e870: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
e880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
e890: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
e8a0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
e8b0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
e8c0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
e8d0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
e8e0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
e8f0: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
e900: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
e910: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
e920: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
e930: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
e940: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
e950: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
e960: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
e970: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
e980: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
e990: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
e9a0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
e9b0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
e9c0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
e9d0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
e9e0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
e9f0: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
ea00: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ea10: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
ea20: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
ea30: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
ea40: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
ea50: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
ea60: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
ea70: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
ea80: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
ea90: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
eaa0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
eab0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
eac0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
ead0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
eae0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
eaf0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
eb00: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
eb10: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
eb20: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
eb30: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
eb40: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
eb50: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
eb60: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
eb70: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
eb80: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
eb90: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
eba0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
ebb0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
ebc0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
ebd0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
ebe0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ebf0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
ec00: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
ec10: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
ec20: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ec30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ec40: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
ec50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ec60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
ec70: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
ec80: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
ec90: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
eca0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ecb0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
ecc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
ecd0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
ece0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
ecf0: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
ed00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ed10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ed20: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
ed30: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
ed40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
ed50: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
ed60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
ed70: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
ed80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
ed90: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
eda0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
edb0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
edc0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
edd0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
ede0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
edf0: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
ee00: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
ee10: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
ee20: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
ee30: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
ee40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
ee50: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
ee60: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
ee70: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
ee80: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
ee90: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
eea0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
eeb0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
eec0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
eed0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
eee0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
eef0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
ef00: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
ef10: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
ef20: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
ef30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
ef40: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
ef50: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
ef60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ef70: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
ef80: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
ef90: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
efa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efb0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
efc0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
efd0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
efe0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
eff0: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f000: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f010: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f020: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f030: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f050: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f060: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f070: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f080: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f090: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0b0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f0c0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f0d0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f0f0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f110: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f120: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f130: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f140: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f150: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f160: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f190: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f1a0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f1b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f1e0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f1f0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f200: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f210: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f220: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f230: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f250: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f260: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f270: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f280: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f290: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f2a0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f2b0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f2c0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f2d0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f2e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f2f0: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f300: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f310: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f320: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f330: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f340: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f350: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f360: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f370: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f380: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
f390: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
f3a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f3b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
f3c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f3d0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
f3e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f3f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
f400: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
f410: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
f420: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
f430: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
f440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f450: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
f460: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
f470: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
f480: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
f490: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
f4a0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
f4b0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
f4c0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
f4d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
f4e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f4f0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
f500: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
f510: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
f520: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
f530: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
f540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f550: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
f560: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
f570: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
f580: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
f590: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f5a0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
f5b0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
f5c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
f5d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
f5e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f5f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f610: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
f620: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
f630: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
f640: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
f650: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
f660: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
f670: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
f680: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
f690: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
f6a0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f6b0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
f6c0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
f6d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
f6e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
f6f0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f700: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f710: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
f720: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
f730: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f740: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f750: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f760: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
f770: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
f780: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f790: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f7a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f7b0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
f7c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f7d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
f7e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
f7f0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
f800: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
f810: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
f820: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
f830: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
f840: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
f850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
f860: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
f870: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f880: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
f890: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
f8a0: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
f8b0: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
f8c0: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
f8d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f8e0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f8f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f900: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
f910: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
f920: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
f930: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f940: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f950: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
f960: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
f970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f980: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
f990: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
f9a0: 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
f9b0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
f9c0: 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
f9d0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f9e0: 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
f9f0: 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
fa00: 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
fa10: 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
fa20: 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
fa30: 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
fa40: 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
fa50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fa60: 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
fa70: 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
fa80: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fa90: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
faa0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
fab0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
fac0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
fad0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
fae0: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
faf0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
fb00: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
fb10: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
fb20: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
fb30: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
fb40: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
fb50: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
fb60: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
fb70: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
fb80: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
fb90: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
fba0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
fbb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
fbc0: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
fbd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
fbe0: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
fbf0: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
fc00: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
fc10: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
fc20: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
fc30: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
fc40: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
fc50: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
fc60: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
fc70: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
fc80: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
fc90: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
fca0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
fcb0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
fcc0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fcd0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
fce0: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
fcf0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
fd00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
fd10: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
fd20: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
fd30: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
fd40: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
fd50: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
fd60: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
fd70: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
fd80: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
fd90: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
fda0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
fdb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
fdc0: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
fdd0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
fde0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fdf0: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
fe00: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
fe10: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
fe20: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
fe30: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
fe40: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
fe50: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
fe60: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
fe70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
fe80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
fe90: 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
fea0: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
feb0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
fec0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
fed0: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
fee0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
fef0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ff00: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
ff10: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ff20: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
ff30: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
ff40: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
ff50: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
ff60: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
ff70: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
ff80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
ff90: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
ffa0: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
ffb0: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
ffc0: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
ffd0: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
ffe0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
fff0: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10000 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10010 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10020 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10030 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
10040 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10060 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10070 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10080 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10090 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
100a0 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
100b0 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
100c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
100d0 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
100e0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
100f0 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10100 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10110 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10120 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
10130 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
10140 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10150 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10160 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10180 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10190 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
101a0 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
101b0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
101c0 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
101d0 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
101e0 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
101f0 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10200 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10210 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10220 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
10230 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
10240 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10250 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10260 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10270 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
10280 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10290 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
102a0 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
102b0 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
102c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
102d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
102e0 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
102f0 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10300 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10310 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10320 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
10330 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
10340 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
10350 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
10360 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
10370 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
10380 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10390 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
103a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
103b0 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
103c0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
103d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
103e0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
103f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10400 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10410 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10440 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10450 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10480 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10490 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
104c0 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
104d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
104e0 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10500 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10510 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10520 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10550 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10560 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10570 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10580 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10590 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
105a0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
105b0 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
105c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
105d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
105e0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
105f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10600 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10610 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
10620 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10640 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10650 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10660 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
10670 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
10680 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10690 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
106a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
106b0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
106c0 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
106d0 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
106e0 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
106f0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
10700 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
10710 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
10720 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
10730 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
10740 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
10750 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10760 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
10770 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
10780 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
10790 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
107b0 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
107c0 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
107d0 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
107e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
107f0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
10800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
10810 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
10820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
10830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
10840 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
10850 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
10860 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10870 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10880 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
10890 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
108a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
108b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
108c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
108d0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
108e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
108f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
10900 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
10910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10930 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
10940 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
10950 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
10970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10980 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
10990 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
109a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
109b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
109c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
109d0 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
109e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
109f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10a00 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10a10 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10a20 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
10a30 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10a40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10a50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10a60 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64  nalMagic, 8, iHd
10a70 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
10a80 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
10a90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
10aa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ab0 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
10ac0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
10ad0 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
10ae0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
10af0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
10b00 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
10b10 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
10b20 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
10b30 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
10b40 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
10b50 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
10b60 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
10b70 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
10b80 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
10b90 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
10ba0 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
10bb0 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
10bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
10bd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
10be0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
10bf0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
10c00 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
10c10 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
10c20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
10c30 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
10c40 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
10c50 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
10c60 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
10c70 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
10c80 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
10c90 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
10ca0 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
10cb0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
10cc0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10cd0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10ce0 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
10cf0 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
10d10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10d20 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
10d30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
10d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
10d50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
10d70 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
10d80 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
10d90 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
10da0 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
10db0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
10dc0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
10dd0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10de0 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
10df0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
10e00 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
10e10 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
10e20 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
10e30 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10e60 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
10e70 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
10e80 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
10e90 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
10ea0 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
10eb0 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
10ec0 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
10ed0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
10ee0 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
10ef0 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
10f00 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
10f10 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
10f20 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
10f30 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
10f40 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
10f50 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
10f60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10f70 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
10f80 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
10f90 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
10fa0 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
10fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  ){.  sqlite3Back
10fc0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
10fd0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
10fe0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
10ff0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11000 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
11010 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11020 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11030 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11040 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11050 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11060 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11070 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11080 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11090 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
110a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
110b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
110c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
110d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
110e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
110f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11100 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11120 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11130 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11140 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11150 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11160 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11170 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11180 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11190 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
111a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
111b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
111c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
111d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
111e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
111f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11200 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11210 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11220 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11230 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11240 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11250 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11260 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11270 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11280 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11290 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
112a0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
112b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
112c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
112d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
112e0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
112f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11310 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11320 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11330 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11340 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11350 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11360 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11370 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11380 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11390 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
113a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
113b0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
113c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
113d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
113e0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
113f0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11400 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11410 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11420 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11430 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11440 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11450 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11460 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11470 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11480 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
114a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
114b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
114c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
114d0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
114e0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
114f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11500 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11510 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11520 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11530 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11540 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11550 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11560 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11570 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11580 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11590 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
115a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
115b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
115c0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
115d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
115e0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
115f0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11600 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11610 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11620 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11630 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11640 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11650 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11670 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11680 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
116a0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
116b0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
116c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
116d0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
116e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
116f0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11700 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11710 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11720 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11730 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11740 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11750 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11760 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11770 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11780 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11790 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
117a0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
117b0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
117c0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
117d0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
117e0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
117f0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11800 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11810 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11820 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11830 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11840 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11850 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11860 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11870 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11880 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11890 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
118a0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
118b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
118c0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
118d0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
118e0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
118f0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11900 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11910 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11920 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11930 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11940 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11950 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11960 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11980 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11990 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
119a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
119b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
119c0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
119d0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
119e0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
119f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11a10 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11a20 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11a30 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11a40 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11a50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11a60 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11a70 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11a80 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11a90 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11aa0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11ab0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11ac0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11ad0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11af0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
11b00 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
11b10 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
11b20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11b30 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
11b40 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
11b50 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
11b60 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
11b70 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
11b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11b90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11ba0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
11bb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11bc0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11bd0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
11be0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bf0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11c00 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
11c10 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11c20 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11c30 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
11c40 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c50 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
11c70 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
11c80 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
11ca0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
11cb0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
11cc0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
11cd0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
11ce0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
11cf0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
11d00 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
11d10 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11d20 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11d30 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
11d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
11d50 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
11d60 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
11d70 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
11d80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
11d90 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
11da0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
11db0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
11dc0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
11dd0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
11de0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
11df0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
11e00 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
11e10 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
11e20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
11e30 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
11e40 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
11e50 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
11e60 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
11e70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
11e80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e90 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
11ea0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
11eb0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
11ec0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
11ed0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
11ee0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
11ef0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
11f00 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
11f10 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
11f20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
11f30 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
11f40 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
11f50 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
11f60 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
11f70 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
11f80 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
11f90 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
11fa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11fb0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
11fc0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
11fd0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
11fe0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
11ff0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12000 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12010 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12020 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12030 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12040 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12050 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12060 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12070 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12080 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12090 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
120a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
120b0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
120c0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
120d0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
120e0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
120f0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12100 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12110 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12120 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12130 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12140 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12150 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12160 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12180 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12190 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
121a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
121b0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
121c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
121d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
121e0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  K;.  }..  pPager
121f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12210 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
12220 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
12230 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
12240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12250 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
12260 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
12270 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
12280 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
12290 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
122a0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
122b0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
122c0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
122d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
122e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
122f0 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
12300 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
12310 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
12320 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
12330 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
12340 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
12350 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
12360 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
12370 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
12380 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
12390 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
123a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
123b0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
123c0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
123d0 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
123e0 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
123f0 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
12400 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
12410 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
12420 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
12430 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
12440 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
12450 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
12460 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
12470 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
12480 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
12490 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
124a0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
124b0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
124c0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
124d0 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
124e0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
124f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12500 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
12510 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
12520 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
12530 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
12540 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
12550 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
12560 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12570 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
12580 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
12590 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
125a0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
125b0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
125c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
125d0 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
125e0 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
125f0 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
12600 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
12610 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
12620 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
12630 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
12640 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
12650 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
12660 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
12670 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
12680 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
126a0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
126b0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
126c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
126d0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
126e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
126f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
12700 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
12710 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
12720 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
12730 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
12740 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
12750 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12760 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12770 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
12780 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12790 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  AGER_ERROR;.  }.
127a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
127b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
127c0 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
127d0 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
127e0 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
127f0 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
12800 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
12810 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
12820 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
12830 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
12840 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
12850 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
12860 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
12870 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
12880 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
12890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
128a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
128b0 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
128c0 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
128d0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
128e0 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ion..** .** This
128f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
12900 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45  r called in PAGE
12910 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
12920 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a  f it is called.*
12930 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20  * in PAGER_NONE 
12940 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  or PAGER_SHARED 
12950 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f  state and the lo
12960 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a  ck held is less.
12970 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61  ** exclusive tha
12980 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
12990 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  k, it is a no-op
129a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
129b0 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
129c0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
129d0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
129e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
129f0 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
12a00 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
12a10 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
12a20 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
12a30 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
12a40 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12a50 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
12a60 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
12a70 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
12a80 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
12a90 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
12aa0 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
12ab0 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
12ac0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12ad0 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
12ae0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
12af0 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
12b00 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
12b10 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
12b20 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
12b30 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
12b40 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
12b50 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
12b60 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
12b70 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
12b80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
12b90 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
12ba0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12bb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12bc0 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
12bd0 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
12be0 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
12bf0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
12c00 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12c10 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
12c20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
12c30 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
12c40 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
12c50 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12c60 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
12c70 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
12c80 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
12c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
12ca0 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
12cb0 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
12cc0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
12cd0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
12ce0 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
12cf0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
12d00 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
12d10 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
12d20 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
12d30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
12d40 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12d50 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
12d60 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
12d70 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
12d80 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
12d90 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12da0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
12db0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12dc0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12dd0 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
12de0 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
12df0 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
12e00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
12e10 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
12e20 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
12e30 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
12e40 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
12e50 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12e60 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
12e70 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
12e80 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
12e90 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12ea0 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
12eb0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
12ec0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
12ed0 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65  alized, the page
12ee0 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
12ef0 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a  _READER state..*
12f00 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
12f10 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f  non-exclusive ro
12f20 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65  llback mode, the
12f30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
12f40 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61  e is .** downgra
12f50 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f  ded to a SHARED_
12f60 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
12f70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
12f80 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
12f90 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
12fa0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
12fb0 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
12fc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
12fd0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
12fe0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
12ff0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
13000 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
13010 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13020 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
13030 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
13040 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
13050 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13060 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
13070 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
13080 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
13090 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
130a0 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
130b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
130c0 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
130d0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
130e0 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
130f0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
13100 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
13110 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
13120 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
13130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
13140 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
13150 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
13160 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13170 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
13190 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20  nt hasMaster){. 
131a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
131b0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
131c0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
131d0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
131e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
131f0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
13200 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
13210 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
13220 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
13230 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
13240 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
13250 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
13260 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
13270 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
13280 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
13290 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
132a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
132b0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
132c0 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
132d0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
132e0 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
132f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
13300 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
13310 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
13320 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
13330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
13340 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
13350 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
13360 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
13370 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
13380 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
13390 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
133a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
133b0 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
133c0 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
133d0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
133e0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
133f0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
13400 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
13410 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
13420 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
13430 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
13440 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
13450 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
13460 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
13470 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13480 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
13490 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
134a0 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
134b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
134c0 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
134d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
134e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
134f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
13500 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
13510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13520 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
13530 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
13540 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
13550 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
13560 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
13570 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
13580 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
135a0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
135b0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
135c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
135d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
135e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
135f0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
13600 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13610 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
13620 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
13630 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
13640 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
13650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
13660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13670 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
13680 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
136a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
136b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
136c0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
136d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
136e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
136f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13700 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13710 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13720 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
13730 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
13740 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
13750 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
13790 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
137a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
137b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
137c0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
137d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
137e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
137f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13800 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
13810 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
13820 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
13830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
13850 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
13860 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
13870 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
13880 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
13890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
138a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
138c0 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
138d0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
138e0 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
138f0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
13900 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
13910 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
13920 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
13930 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
13940 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
13950 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
13960 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
13970 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
13980 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
13990 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
139a0 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
139b0 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
139c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
139d0 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  al. .      */.  
139e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
139f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13a10 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13a20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13a30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a50 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13a60 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13a70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13a90 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13aa0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13ab0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13ac0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
13ad0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13af0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13b00 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
13b10 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
13b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13b40 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
13b50 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
13b60 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
13b70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
13b80 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
13b90 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
13ba0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
13bb0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
13bc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
13bd0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13be0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
13bf0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
13c00 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
13c10 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13c30 65 72 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20  erUnref(p);.    
13c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13c50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
13c60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
13c70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
13c80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
13c90 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
13ca0 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
13cb0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
13cc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13cd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13ce0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
13cf0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
13d00 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69  r->dbSize);..  i
13d10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
13d20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
13d30 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72   Drop the WAL wr
13d40 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79  ite-lock, if any
13d50 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63  . Also, if the c
13d60 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e  onnection was in
13d70 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   .    ** locking
13d80 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13d90 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
13da0 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20  onger, drop the 
13db0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a  EXCLUSIVE .    *
13dc0 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  * lock held on t
13dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32  ..    */.    rc2
13df0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64   = sqlite3WalEnd
13e00 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
13e10 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
13e20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d      assert( rc2=
13e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13e40 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
13e50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
13e60 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
13e70 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
13e80 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
13e90 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
13ea0 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
13eb0 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
13ec0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
13ed0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
13ee0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13ef0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
13f00 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
13f10 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
13f20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
13f30 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
13f40 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
13f50 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
13f60 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
13f70 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
13f80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
13f90 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
13fa0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
13fb0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
13fc0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
13fd0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
13fe0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
13ff0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
14000 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
14010 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14020 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14030 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14040 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14050 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14060 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14070 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14080 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14090 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
140a0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
140b0 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
140c0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
140d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
140e0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
140f0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14100 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14110 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14120 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14130 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14140 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14150 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14160 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14170 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14180 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14190 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
141a0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
141b0 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
141c0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
141d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
141e0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
141f0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14200 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14210 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14220 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14230 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14240 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14250 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14260 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14270 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14280 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14290 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
142a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
142b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
142c0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
142d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
142e0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
142f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14300 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14310 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14320 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14330 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14340 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14350 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14360 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14380 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
143a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
143b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
143c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
143d0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
143e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
143f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14400 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14410 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14420 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
14430 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14440 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14460 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14470 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14480 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14490 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
144a0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
144b0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
144c0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
144d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
144e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
144f0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
14500 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
14510 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
14520 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
14530 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
14540 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
14550 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
14560 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
14570 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
14580 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
14590 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
145a0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
145b0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
145c0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
145d0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
145e0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
145f0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
14600 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
14610 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
14620 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
14630 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
14640 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
14650 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
14660 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
14670 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
14680 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
14690 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
146a0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
146b0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
146c0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
146d0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
146e0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
146f0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
14700 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
14710 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
14720 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
14730 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
14740 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
14750 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
14760 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
14770 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
14780 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
14790 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
147a0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
147b0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
147c0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
147d0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
147e0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
147f0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
14800 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
14810 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
14820 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
14830 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
14840 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
14850 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
14860 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
14870 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
14880 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
14890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
148a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
148b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
148c0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
148d0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
148e0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
148f0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
14900 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
14910 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
14920 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
14930 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
14940 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
14950 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
14960 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
14970 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
14980 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
14990 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
149a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
149b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
149c0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
149d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
149e0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
149f0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
14a00 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
14a30 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
14a40 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
14a50 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
14a60 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
14a70 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
14a80 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
14a90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
14aa0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
14ab0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
14ac0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
14ad0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
14ae0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
14af0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
14b00 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
14b10 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
14b20 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
14b30 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
14b40 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
14b50 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
14b60 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
14b70 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
14b80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14b90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
14ba0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14bb0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
14bc0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
14bd0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
14be0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
14bf0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
14c00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c10 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
14c20 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
14c30 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14c40 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
14c50 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
14c60 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
14c70 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
14c80 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
14c90 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
14ca0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
14cb0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
14cc0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
14cd0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
14ce0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
14cf0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
14d00 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
14d10 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
14d20 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
14d30 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
14d40 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
14d50 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
14d60 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
14d70 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
14d80 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
14d90 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
14da0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
14db0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
14dc0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
14dd0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
14de0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
14df0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
14e00 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
14e10 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
14e20 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14e30 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
14e40 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
14e50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14e60 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
14e70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
14e80 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
14e90 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
14ea0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14eb0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
14ec0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
14ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
14ee0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
14ef0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14f00 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
14f10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
14f20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
14f30 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f40 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
14f50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
14f60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
14f70 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
14f80 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
14f90 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
14fa0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
14fb0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
14fc0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
14fd0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
14fe0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
14ff0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15000 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15010 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15020 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
15030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15040 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
15050 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
15060 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
15070 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
15080 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15090 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
150a0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
150b0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
150c0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
150d0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
150e0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
150f0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15100 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15110 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15120 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15130 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15140 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15150 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15160 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15170 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15180 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15190 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
151a0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
151b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
151c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151d0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
151e0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
151f0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15220 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15230 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15260 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15270 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15280 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
152a0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
152b0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
152c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
152d0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
152e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
152f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15300 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15310 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15320 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15330 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15340 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15350 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15360 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15380 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15390 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
153a0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
153b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
153c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
153d0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
153e0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
153f0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15410 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15420 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15430 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15440 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15450 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15460 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15480 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
154b0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
154c0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
154d0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
154e0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
154f0 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
15500 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
15510 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
15520 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
15530 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
15540 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
15550 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
15560 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
15570 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
15580 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
15590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
155a0 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
155b0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
155c0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
155d0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
155e0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
155f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15600 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15620 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
15630 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
15640 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
15650 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
15660 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
15670 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
15680 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
15690 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
156a0 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
156b0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
156c0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
156d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
156e0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
156f0 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
15700 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
15710 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
15720 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
15730 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15740 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
15750 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15760 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
15770 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
15780 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
15790 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
157a0 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
157b0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
157c0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
157d0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
157e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
157f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15800 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15810 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15820 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
15830 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
15840 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
15850 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
15870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
15880 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
15890 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
158a0 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
158b0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
158c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
158d0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
158e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
158f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
15900 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
15910 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
15920 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
15930 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15940 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
15950 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
15960 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
15970 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
15980 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
15990 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
159a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
159b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
159c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
159d0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
159e0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
159f0 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
15a00 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
15a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
15a30 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
15a40 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
15a50 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
15a60 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
15a70 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
15a80 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
15a90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
15aa0 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
15ab0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
15ac0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
15ad0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
15ae0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
15af0 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
15b00 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
15b10 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
15b20 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
15b30 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
15b40 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
15b50 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
15b60 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
15b70 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
15b80 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
15b90 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
15ba0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
15bb0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
15bc0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
15bd0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
15be0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
15bf0 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
15c00 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
15c10 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
15c20 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
15c30 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
15c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15c50 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
15c60 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
15c70 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
15c80 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
15c90 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
15ca0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15cb0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
15cc0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
15cd0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
15ce0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
15cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15d00 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
15d10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
15d20 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
15d30 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79  y been played by
15d40 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
15d50 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
15d60 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
15d70 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
15d80 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
15d90 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
15da0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
15db0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
15dc0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
15dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15de0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15df0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
15e00 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
15e10 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
15e20 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
15e30 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
15e40 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15e50 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
15e60 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
15e70 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
15e80 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
15e90 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
15ea0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
15eb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
15ec0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
15ed0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
15ee0 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
15ef0 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
15f00 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
15f10 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
15f20 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
15f30 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
15f40 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
15f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
15f60 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
15f70 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
15f80 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
15f90 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
15fa0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
15fb0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
15fc0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
15fd0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
15fe0 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
15ff0 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16000 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16010 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16020 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
16030 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16040 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
16050 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
16060 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
16070 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
16080 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16090 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
160a0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
160b0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
160c0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
160d0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
160e0 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
160f0 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16100 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16110 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16120 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16130 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16140 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16150 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16160 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16170 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16180 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16190 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
161a0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
161b0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
161c0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
161d0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
161e0 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
161f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16200 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16210 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16220 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16230 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16240 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16250 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16260 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16270 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16280 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16290 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
162a0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
162b0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
162c0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
162d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
162e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
162f0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16300 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16310 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16320 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16330 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16340 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16350 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16360 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16370 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16380 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16390 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
163a0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
163b0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
163c0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
163d0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
163e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
163f0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
16400 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
16410 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16420 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
16430 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
16440 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
16450 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
16460 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
16470 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
16480 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
16490 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
164a0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
164b0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
164c0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
164d0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
164e0 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
164f0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
16500 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
16510 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
16520 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
16530 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
16540 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
16550 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
16560 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
16570 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
16580 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
16590 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
165a0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
165b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
165c0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
165d0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
165e0 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
165f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
16600 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
16610 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
16620 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
16630 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
16640 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
16650 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
16660 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
16670 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
16680 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
16690 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
166a0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
166b0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
166c0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
166d0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
166e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
166f0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
16700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
16710 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
16720 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
16730 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
16740 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
16750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16760 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
16770 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20   || pPg==0 );.  
16780 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
16790 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
167a0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
167b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
167c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
167d0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
167e0 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
167f0 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
16800 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
16810 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
16820 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
16830 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
16840 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
16850 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
16860 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
16870 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
16880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
16890 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
168a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
168b0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
168c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
168d0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
168e0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
168f0 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
16900 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16910 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
16920 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
16930 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
16940 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
16950 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
16960 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
16970 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
16980 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
16990 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
169a0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
169b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
169c0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
169d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
169e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
169f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
16a00 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
16a10 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
16a20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16a30 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
16a40 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
16a50 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
16a60 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
16a70 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
16a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16a90 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
16aa0 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
16ab0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16ac0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
16ad0 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
16ae0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
16af0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
16b00 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
16b10 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
16b20 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
16b30 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
16b40 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
16b50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
16b60 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
16b70 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
16b80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16b90 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
16ba0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
16bb0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
16bc0 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
16bd0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
16be0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16bf0 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
16c00 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
16c10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
16c20 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
16c30 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
16c40 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
16c50 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
16c60 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
16c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16c80 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
16c90 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
16ca0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
16cb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
16cc0 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
16cd0 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
16ce0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
16cf0 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
16d00 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
16d10 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
16d20 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
16d30 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
16d40 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
16d50 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
16d60 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
16d70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16d80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
16d90 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
16da0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
16db0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
16dc0 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
16dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
16de0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
16df0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
16e00 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
16e10 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
16e20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
16e30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
16e40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
16e50 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
16e60 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
16e70 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
16e80 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
16e90 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
16ea0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
16eb0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
16ec0 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
16ed0 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
16ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16ef0 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
16f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16f10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
16f30 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b  r->doNotSpill++;
16f40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16f50 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
16f60 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
16f70 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
16f80 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
16f90 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pill==1 );.    p
16fa0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
16fb0 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  l--;.    if( rc!
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
16fe0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
16ff0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
17000 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17010 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
17020 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
17030 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
17040 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
17050 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
17060 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
17070 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
17080 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
17090 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
170a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
170b0 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
170c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
170d0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
170e0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
170f0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
17100 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
17110 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
17120 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
17130 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
17140 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
17150 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
17160 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
17170 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
17180 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
17190 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
171a0 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
171b0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
171c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
171d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
171e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
171f0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
17200 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
17210 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
17220 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
17230 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
17240 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
17250 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
17260 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
17270 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
17280 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17290 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
172a0 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
172b0 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
172c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
172d0 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
172e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
172f0 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
17300 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
17310 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
17320 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
17330 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
17340 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
17350 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
17360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17370 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
17380 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
17390 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
173a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
173b0 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
173c0 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
173d0 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
173e0 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
173f0 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
17400 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
17410 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
17420 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17430 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
17440 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
17450 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
17460 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
17470 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
17480 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
17490 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
174a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
174b0 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
174c0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
174d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
174e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
174f0 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
17500 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
17510 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
17520 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17530 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
17540 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
17550 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
17560 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
17570 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
17580 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
17590 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
175a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
175b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
175c0 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
175d0 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
175e0 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
175f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
17600 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
17610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17620 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
17630 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
17640 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
17650 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
17660 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
17670 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
17680 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
17690 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
176a0 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
176b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
176c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
176d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
176e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
176f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
17700 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
17710 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
17720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
17730 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
17740 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
17750 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
17760 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
17770 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
17780 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
17790 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
177a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
177b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
177c0 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
177d0 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
177e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
177f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
17800 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
17810 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
17820 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
17830 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17840 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
17850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17860 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17870 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
17880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17890 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
178a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
178b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
178c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
178d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
178e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
178f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
17900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17910 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
17920 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
17930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
17940 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
17950 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
17960 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17970 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
17980 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
17990 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
179a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
179b0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
179c0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
179d0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
179e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
179f0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
17a00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
17a10 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
17a20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
17a30 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
17a40 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
17a50 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
17a60 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
17a70 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
17a80 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
17a90 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
17aa0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
17ab0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
17ac0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
17ad0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
17ae0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
17af0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
17b00 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
17b10 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
17b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
17b30 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
17b40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
17b50 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
17b60 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
17b70 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
17b80 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
17b90 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
17ba0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
17bb0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
17bc0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
17bd0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
17be0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
17bf0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
17c00 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
17c10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
17c20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
17c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17c40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
17c50 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
17c60 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
17c70 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
17c80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
17c90 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
17ca0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
17cb0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
17cc0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
17cd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17ce0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
17cf0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
17d00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17d10 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
17d20 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
17d30 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
17d40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
17d50 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
17d60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
17d70 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
17d80 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
17d90 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
17da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17db0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
17dc0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
17dd0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
17de0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
17df0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17e00 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
17e10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
17e20 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
17e30 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
17e40 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
17e50 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
17e60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
17e70 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
17e80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
17e90 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
17ea0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
17eb0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
17ec0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
17ed0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
17ee0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17ef0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17f00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
17f10 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
17f20 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
17f30 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
17f40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
17f50 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
17f60 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
17f70 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
17f80 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
17f90 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
17fa0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17fb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17fc0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
17fd0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
17fe0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
17ff0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
18000 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
18010 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
18020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18030 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
18040 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
18050 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18060 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18070 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
18080 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
180b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
180c0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
180d0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
180e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
180f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
18110 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
18120 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
18130 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18140 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
18150 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
18160 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
18170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18180 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
18190 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
181a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
181b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
181c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
181d0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
181e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
181f0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
18200 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
18210 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
18220 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
18230 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
18240 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
18250 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18260 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
18270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
18280 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
18290 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
182a0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
182b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
182c0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
182d0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
182e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
182f0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
18300 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
18310 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18320 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
18330 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
18340 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
18350 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18360 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
18370 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
18380 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
18390 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
183a0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
183b0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
183c0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
183d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
183e0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
183f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
18400 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
18410 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
18420 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
18430 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
18440 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18450 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
18460 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
18470 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
18480 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18490 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
184a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
184b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
184c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
184d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
184e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
184f0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
18500 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
18510 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
18520 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
18530 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
18540 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
18550 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
18560 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
18570 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
18580 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
18590 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
185a0 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
185b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
185c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
185d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
185e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
185f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18600 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
18610 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
18620 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
18630 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
18640 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
18650 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
18660 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
18670 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
18680 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
18690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
186a0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  M;.    goto delm
186b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20  aster_out;.  }. 
186c0 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
186d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
186e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b  asterJournal+1];
186f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18700 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
18710 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
18720 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
18730 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  al, 0);.  if( rc
18740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18750 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18760 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
18770 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18780 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72  l] = 0;..  zJour
18790 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
187a0 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  rnal;.  while( (
187b0 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
187c0 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
187d0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
187e0 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72  nt exists;.    r
187f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
18800 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
18810 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
18820 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
18830 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
18840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18850 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
18860 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
18870 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
18880 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
18890 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
188a0 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
188b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
188c0 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70  sts..      ** Op
188d0 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
188e0 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
188f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18900 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  al. If.      ** 
18910 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
18920 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
18930 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18940 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
18950 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
18960 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18970 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18980 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18990 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
189a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
189b0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
189c0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
189d0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
189e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
189f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18a00 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a10 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
18a20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
18a30 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
18a40 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
18a50 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
18a60 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18a70 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
18a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18aa0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18ab0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
18ac0 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
18ad0 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
18ae0 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
18af0 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
18b00 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
18b10 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
18b20 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
18b30 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
18b40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
18b50 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
18b60 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
18b70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f   }.    }.    zJo
18b80 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
18b90 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
18ba0 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20  al)+1);.  }. .  
18bb0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18bc0 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20  Master);.  rc = 
18bd0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18be0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
18bf0 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
18c00 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
18c10 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
18c20 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72  );.  if( pMaster
18c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
18c40 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
18c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
18c60 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
18c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18c80 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(pMaster);.  }
18c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
18cb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
18cc0 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
18cd0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
18ce0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
18cf0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
18d00 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
18d10 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
18d20 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
18d30 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
18d40 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
18d50 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
18d60 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
18d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
18d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
18d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18da0 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74  s not open, or t
18db0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
18dc0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d  in either.** DBM
18dd0 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65  OD or OPEN state
18de0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18df0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
18e00 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20  rwise, the size 
18e10 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
18e20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  is changed to nP
18e30 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
18e40 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
18e50 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66  e bytes). .** If
18e60 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
18e70 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
18e80 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
18e90 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
18ea0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
18eb0 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
18ec0 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
18ed0 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
18ee0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
18ef0 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
18f00 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
18f10 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
18f20 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
18f30 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
18f40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18f50 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
18f60 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
18f70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
18f80 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
18f90 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
18fa0 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
18fb0 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
18fc0 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
18fd0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
18fe0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
18ff0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19000 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19010 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19020 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19030 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19040 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19050 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19060 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19070 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19080 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19090 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
190a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
190b0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
190c0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
190d0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
190e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
190f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19100 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19120 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19130 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
19140 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19150 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
19160 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
19170 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
19180 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
19190 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
191a0 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
191b0 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
191c0 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
191d0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
191e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
191f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
19200 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
19210 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
19220 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
19230 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
19240 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
19250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19260 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
19270 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
19280 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
19290 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
192a0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
192b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
192c0 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
192d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
192e0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
192f0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
19310 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
19320 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
19330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19340 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
19350 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19360 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
19370 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19380 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19390 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
193a0 7a 50 61 67 65 29 20 3c 20 20 63 75 72 72 65 6e  zPage) <  curren
193b0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
193c0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
193d0 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
193e0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
193f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19400 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19410 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
19420 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19430 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
19440 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
19450 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
19460 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
19470 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19490 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
194a0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
194b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
194c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
194d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
194e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
194f0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
19500 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
19510 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
19520 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
19530 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19540 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
19550 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
19560 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
19570 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
19580 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
19590 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
195a0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
195b0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
195c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
195d0 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
195e0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
195f0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
19600 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
19610 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
19620 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
19630 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19640 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
19650 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
19660 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
19670 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
19680 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19690 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
196a0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
196b0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
196c0 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
196d0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
196e0 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
196f0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
19700 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
19710 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
19720 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
19730 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
19740 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
19750 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
19760 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
19770 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
19780 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19790 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
197a0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
197b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
197c0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
197d0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
197e0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
197f0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
19800 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
19810 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
19820 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
19830 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
19840 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
19850 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
19860 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
19870 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19880 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
19890 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
198a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
198b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
198c0 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
198d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
198e0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
198f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19900 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
19910 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
19920 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
19930 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
19940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19950 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
19960 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
19970 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19990 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
199a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
199b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
199c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
199d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
199e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
199f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
19a00 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
19a10 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
19a20 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
19a30 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
19a40 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
19a50 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19a60 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19a70 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19a80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19a90 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19aa0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19ab0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19ac0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19ad0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19ae0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
19af0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
19b00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
19b10 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
19b20 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
19b30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19b40 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
19b50 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19b60 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19b70 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19b80 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19b90 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19ba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19bb0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19bc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19bd0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19be0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
19bf0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
19c00 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19c10 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
19c20 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
19c30 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
19c40 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
19c50 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
19c60 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
19c70 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19c80 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
19c90 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
19ca0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
19cb0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
19cc0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
19cd0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
19ce0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
19cf0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
19d00 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19d10 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
19d20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
19d30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19d40 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
19d50 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19d60 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
19d70 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
19d80 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
19d90 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
19da0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
19db0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
19dc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
19dd0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
19de0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
19df0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
19e00 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
19e10 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
19e20 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
19e30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
19e40 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
19e50 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
19e60 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
19e70 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
19e80 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
19e90 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
19ea0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
19eb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
19ec0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
19ed0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
19ee0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
19ef0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
19f00 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
19f10 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
19f20 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
19f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19f40 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
19f50 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
19f60 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
19f70 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
19f80 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
19f90 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
19fa0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
19fb0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
19fc0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
19fd0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
19fe0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
19ff0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a000 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a010 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a020 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a040 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a050 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a060 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a070 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a080 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a090 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a0a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a0b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a0c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a0d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a0e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a0f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1a100 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1a110 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1a120 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1a130 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1a140 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1a150 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1a160 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1a170 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1a180 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1a190 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1a1a0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1a1b0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1a1c0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1a1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1a1e0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1a1f0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1a200 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1a210 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1a220 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1a230 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a240 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a250 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a260 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a270 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a280 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a290 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a2a0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a2b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a2c0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a2d0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a2e0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a2f0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a300 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a310 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a320 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a330 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a340 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a350 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a360 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a370 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a380 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a390 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a3a0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a3b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a3c0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a3d0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a3e0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a3f0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a400 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a410 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a420 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a430 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a440 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a450 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a470 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a480 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a490 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a4a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a4b0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a4c0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a4d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a4e0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a4f0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a530 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a540 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a550 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a560 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a570 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a580 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a590 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a5a0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a5b0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a5c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a5d0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a5e0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a5f0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a620 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a630 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a650 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a660 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1a670 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1a680 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1a690 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1a6a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a6b0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1a6c0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1a6d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a6e0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1a6f0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1a700 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1a710 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1a720 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1a730 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1a740 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1a750 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1a760 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1a770 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1a780 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a790 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a7a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a7b0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1a7c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1a7e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1a7f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1a800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a810 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1a820 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1a830 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1a840 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a850 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1a860 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1a870 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1a880 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1a890 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1a8a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1a8b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1a8c0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1a8d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1a8e0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1a8f0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1a900 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1a910 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1a920 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1a930 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1a940 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1a950 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1a960 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1a970 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1a980 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1a990 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1a9a0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1a9b0 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1a9c0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1a9d0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1a9e0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1a9f0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1aa00 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1aa10 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1aa20 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1aa30 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1aa40 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1aa50 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1aa60 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1aa70 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1aa80 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1aa90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1aaa0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1aab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1aac0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1aad0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1aae0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1aaf0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1ab00 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1ab10 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1ab20 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1ab30 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1ab40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ab50 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1ab60 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1ab70 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1ab80 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1ab90 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1aba0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1abb0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1abc0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1abd0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1abe0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1abf0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1ac00 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1ac10 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1ac20 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1ac30 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1ac40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac50 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1ac60 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1ac70 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1ac80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac90 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1aca0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1acb0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1acc0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1acd0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1ace0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1acf0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1ad00 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1ad10 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1ad20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1ad30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1ad40 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1ad50 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1ad60 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1ad70 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1ad80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1ad90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ada0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1adb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1adc0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1add0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ade0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1adf0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1ae00 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1ae10 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1ae20 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1ae30 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1ae40 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1ae50 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1ae60 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1ae70 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1ae80 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1ae90 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1aea0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1aeb0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1aec0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1aed0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1aee0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1aef0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1af00 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1af10 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1af20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1af30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1af40 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1af50 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1af60 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1af70 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1af80 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1af90 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1afa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1afb0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1afc0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1afd0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1afe0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1aff0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b000 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b010 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b020 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b030 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b040 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b050 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b060 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b070 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b080 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b090 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b0a0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b0b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b0c0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b0d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b0e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b0f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1b100 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1b110 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1b120 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1b130 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1b140 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1b150 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1b160 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1b170 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1b180 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1b190 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1b1a0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1b1b0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b1c0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1b1d0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1b1e0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1b1f0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1b200 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1b210 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1b220 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1b230 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b240 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b250 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b260 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b270 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b280 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b290 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b2a0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b2b0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b2c0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b2d0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b2e0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b2f0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b310 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b320 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b330 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b340 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b350 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b360 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b370 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b380 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b390 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b3a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b3b0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b3c0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b3d0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b3e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b3f0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b400 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b410 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b430 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b440 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b450 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b460 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b490 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b4a0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b4b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b4c0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b4d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b4e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b4f0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b500 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b510 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b520 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b530 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b540 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b550 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b560 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b570 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b580 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b590 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b5a0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b5b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b5c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b5d0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b5e0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b5f0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b630 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b650 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1b660 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1b690 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b6a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b6b0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1b6c0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1b6d0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1b6e0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1b6f0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1b700 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1b710 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b720 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1b730 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1b740 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1b750 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1b760 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1b770 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1b780 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1b790 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1b7a0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1b7b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1b7c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1b7d0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1b7e0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1b7f0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1b800 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1b810 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b820 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1b830 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b840 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1b850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1b860 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1b870 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1b880 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1b890 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1b8a0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1b8b0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1b8c0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1b8d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1b8e0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1b8f0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1b900 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1b910 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1b920 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1b930 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1b940 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1b950 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1b960 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1b970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b980 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1b990 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1b9a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b9b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1b9c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1b9d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1b9e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1b9f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1ba00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ba10 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1ba20 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1ba30 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1ba40 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1ba50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1ba60 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1ba70 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1ba80 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1ba90 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1baa0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1bab0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1bac0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1bad0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bae0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1baf0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
1bb00 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bb10 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
1bb20 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1bb30 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
1bb40 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1bb50 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
1bb60 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
1bb70 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1bb80 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1bb90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1bba0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1bbb0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1bbc0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1bbd0 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1bbe0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1bbf0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1bc00 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1bc10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1bc20 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1bc30 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1bc40 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1bc50 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1bc60 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1bc70 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1bc80 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1bc90 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1bca0 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1bcb0 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1bcc0 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1bcd0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1bce0 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1bcf0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1bd00 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1bd10 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1bd20 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1bd30 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1bd40 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1bd50 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1bd60 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1bd70 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1bd80 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1bd90 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1bda0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1bdb0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1bdc0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1bdd0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1bde0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1bdf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1be00 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1be10 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1be20 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1be30 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1be40 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1be50 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1be60 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1be70 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1be80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1be90 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1bea0 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1beb0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1bec0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1bed0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1bee0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1bef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1bf00 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1bf10 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bf20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf30 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1bf40 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1bf50 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1bf60 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
1bf70 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1bf80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1bf90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bfa0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1bfb0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1bfc0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1bfd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bfe0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1bff0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1c000 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1c010 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1c020 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1c030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1c040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c050 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1c060 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1c070 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1c0a0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1c0b0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1c0c0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1c0d0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1c0e0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1c0f0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1c100 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1c110 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1c120 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1c130 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1c140 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c150 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1c160 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1c170 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1c180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c190 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1c1a0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1c1b0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c1c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c1d0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1c1e0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1c1f0 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1c200 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1c210 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1c220 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1c230 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c240 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1c250 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1c260 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1c270 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1c280 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1c290 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1c2a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c2b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1c2c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1c2d0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c2e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1c2f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1c300 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1c310 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c330 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1c340 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1c350 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c360 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
1c370 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
1c380 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
1c390 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
1c3a0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
1c3b0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1c3c0 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
1c3d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c3e0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c3f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c400 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
1c410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c420 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
1c430 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
1c440 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1c450 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1c460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c470 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1c480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c490 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1c4a0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1c4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c4c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1c4d0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1c4e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c4f0 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1c500 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c510 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1c520 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1c530 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c540 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1c550 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c560 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1c570 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c580 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1c590 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1c5a0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1c5b0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1c5c0 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
1c5d0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
1c5e0 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
1c5f0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1c600 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c610 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
1c620 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
1c630 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c640 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c650 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1c660 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c670 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1c680 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1c690 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1c6a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c6b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c6c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c6d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1c6e0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c6f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1c700 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1c710 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1c720 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1c730 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1c740 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1c750 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1c760 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1c770 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1c780 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1c790 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1c7a0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1c7b0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1c7c0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1c7d0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1c7e0 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1c7f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c800 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1c810 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1c820 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1c830 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1c840 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1c850 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1c860 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1c870 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1c880 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1c890 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1c8a0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1c8b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1c8c0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1c8d0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1c8e0 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1c8f0 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1c900 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1c910 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c920 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1c930 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1c940 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1c950 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1c960 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1c970 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1c980 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1c990 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1c9a0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1c9b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c9c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1c9d0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1c9e0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c9f0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1ca00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca10 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1ca20 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1ca30 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1ca40 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1ca50 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1ca60 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1ca70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ca80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1ca90 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1caa0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1cab0 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1cac0 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1cad0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1cae0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1caf0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1cb00 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1cb10 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1cb20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cb30 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1cb40 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1cb50 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1cb60 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1cb70 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cb80 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cb90 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cba0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1cbb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1cbc0 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1cbd0 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1cbe0 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1cbf0 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1cc00 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1cc10 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1cc20 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1cc30 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1cc40 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1cc50 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1cc60 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1cc70 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1cc80 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1cc90 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1cca0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1ccb0 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1ccc0 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1ccd0 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1cce0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1ccf0 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1cd00 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1cd10 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1cd20 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1cd30 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1cd40 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1cd50 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1cd60 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1cd70 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1cd80 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1cd90 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1cda0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1cdb0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1cdc0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1cdd0 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1cde0 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1cdf0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1ce00 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1ce10 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1ce20 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1ce30 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1ce40 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1ce50 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1ce60 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1ce70 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1ce80 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ce90 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1cea0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1ceb0 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1cec0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1ced0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1cee0 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1cef0 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1cf00 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1cf10 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1cf20 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1cf30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1cf40 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1cf50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cf60 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1cf70 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1cf80 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1cf90 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1cfa0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1cfb0 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1cfc0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1cfd0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1cfe0 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1cff0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d000 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1d010 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1d020 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1d030 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1d040 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1d050 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1d060 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1d070 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1d080 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1d090 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1d0a0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1d0b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1d0c0 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1d0d0 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1d0e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1d0f0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d100 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1d110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1d120 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1d130 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1d140 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1d150 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1d160 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1d170 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1d180 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1d190 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d1a0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1d1b0 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1d1c0 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1d1d0 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1d1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d1f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d200 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1d210 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1d220 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1d230 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1d240 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1d250 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1d260 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1d270 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1d280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d290 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1d2a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d2b0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1d2c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
1d2d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1d2f0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1d300 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1d320 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
1d330 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1d340 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1d350 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d360 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1d370 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1d380 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1d390 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1d3a0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d3b0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1d3c0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1d3d0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1d3e0 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1d3f0 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1d400 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1d410 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1d420 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1d430 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1d440 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1d450 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1d460 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1d470 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d480 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1d490 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1d4a0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1d4b0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1d4c0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1d4d0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1d4e0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1d4f0 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1d500 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1d510 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1d520 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1d530 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1d540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d560 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1d570 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1d580 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1d590 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1d5a0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1d5b0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1d5c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d5f0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1d600 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1d620 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1d630 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1d640 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1d650 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1d660 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1d670 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1d680 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1d690 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1d6a0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1d6b0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1d6c0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1d6d0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1d6e0 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1d6f0 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1d700 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1d710 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1d720 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1d730 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d740 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1d750 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1d760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d770 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1d780 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1d790 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1d7a0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1d7b0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1d7c0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1d7d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1d7e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1d7f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1d800 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1d810 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1d820 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1d830 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1d840 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1d850 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d860 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1d870 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1d880 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1d890 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d8a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d8b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1d8c0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1d8d0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1d8e0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1d8f0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1d900 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1d910 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1d920 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1d930 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1d940 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1d950 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1d960 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1d970 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1d980 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1d990 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1d9a0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1d9b0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1d9c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1d9d0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1d9e0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1d9f0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1da00 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1da10 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1da20 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1da30 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1da40 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1da50 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1da60 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1da70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1da80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1da90 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dab0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1dac0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1dad0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1dae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1daf0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1db00 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1db10 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1db40 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1db50 2f 0a 20 20 69 6e 74 20 73 79 6e 63 46 6c 61 67  /.  int syncFlag
1db60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1db70 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1db80 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1db90 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1dba0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1dbd0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1dbe0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1dbf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1dc00 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1dc10 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc30 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1dc40 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1dc50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1dc60 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1dc70 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1dc80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1dc90 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1dca0 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1dcb0 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1dcc0 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1dcd0 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1dce0 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1dcf0 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1dd00 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1dd10 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1dd20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1dd30 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1dd40 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1dd50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1dd60 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1dd70 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1dd80 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1dd90 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1dda0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1ddb0 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1ddc0 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1ddd0 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1dde0 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1ddf0 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1de00 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1de10 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1de20 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1de30 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1de40 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48  gHdr *p;.    PgH
1de50 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1de60 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d  List;.    for(p=
1de70 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1de80 3d 20 70 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74  = p); p=p->pDirt
1de90 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1dea0 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1deb0 20 29 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e   ) ppNext = &p->
1dec0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1ded0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1dee0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  );.  }..  if( pL
1def0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1df00 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1df10 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1df20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1df30 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1df40 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1df50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1df60 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1df70 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63  , isCommit, sync
1df80 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  Flags.  );.  if(
1df90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dfa0 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
1dfb0 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  p ){.    PgHdr *
1dfc0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
1dfd0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1dfe0 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ty){.      sqlit
1dff0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1e000 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1e010 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70  p->pgno, (u8 *)p
1e020 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->pData);.    }.
1e030 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1e040 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1e050 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e060 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1e070 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1e080 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
1e090 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e0a0 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  {.    pager_set_
1e0b0 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d  pagehash(p);.  }
1e0c0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1e0d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
1e0e0 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
1e0f0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
1e100 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
1e110 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
1e120 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
1e130 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
1e140 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
1e150 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
1e160 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
1e170 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
1e180 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
1e190 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
1e1a0 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
1e1b0 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
1e1c0 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
1e1d0 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
1e1e0 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
1e1f0 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
1e200 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
1e210 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e220 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
1e230 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
1e240 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e250 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e270 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e280 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
1e290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e2a0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
1e2b0 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
1e2c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
1e2d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e2e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e2f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1e300 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
1e310 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e320 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20  ER_READER );..  
1e330 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  /* sqlite3WalEnd
1e340 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1e350 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
1e360 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
1e370 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  s.  ** transacti
1e380 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  on in locking_mo
1e390 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53  de=EXCLUSIVE.  S
1e3a0 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20  o call it now.  
1e3b0 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69  If we.  ** are i
1e3c0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e  n locking_mode=N
1e3d0 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61  ORMAL and EndRea
1e3e0 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73  d() was previous
1e3f0 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20  ly called,.  ** 
1e400 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61  the duplicate ca
1e410 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a  ll is harmless..
1e420 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61    */.  sqlite3Wa
1e430 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1e440 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1e450 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1e460 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72  e3WalBeginReadTr
1e470 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1e480 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64  ->pWal, &changed
1e490 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1e4a0 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65  ITE_OK || change
1e4b0 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  d ){.    pager_r
1e4c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e4d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e4e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e4f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e500 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1e510 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1e520 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1e530 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1e540 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1e550 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1e560 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e570 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1e580 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1e590 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1e5a0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1e5b0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1e5c0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1e5d0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1e5e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1e5f0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1e600 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1e610 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1e620 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1e630 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1e640 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1e650 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1e660 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1e670 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1e680 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1e690 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e6a0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1e6b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1e6c0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1e6d0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1e700 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1e710 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1e720 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1e730 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1e740 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1e750 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1e760 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1e770 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1e780 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1e790 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1e7a0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1e7b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1e7c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1e7d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e7e0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1e7f0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1e800 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1e810 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1e820 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1e830 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1e840 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1e850 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1e860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e870 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1e880 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1e890 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1e8a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1e8b0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
1e8c0 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  k );.  nPage = s
1e8d0 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
1e8e0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1e8f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1e900 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f  base size was no
1e910 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1e920 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1e930 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d  tem,.  ** determ
1e940 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20  ine it based on 
1e950 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1e970 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20  f the size.  ** 
1e980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e990 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69  file is not an i
1e9a0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
1e9b0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
1e9c0 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77  ,.  ** round dow
1e9d0 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74  n to the nearest
1e9e0 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61   page. Except, a
1e9f0 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74  ny file larger t
1ea00 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73  han 0.  ** bytes
1ea10 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
1ea20 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69  idered to contai
1ea30 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  n at least one p
1ea40 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1ea50 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1ea60 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea80 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
1ea90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1eaa0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1eab0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1eac0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ead0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
1eae0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1eaf0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1eb00 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1eb10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
1eb20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1eb30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eb40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1eb50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1eb60 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1eb70 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
1eb80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
1eb90 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30   nPage==0 && n>0
1eba0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1ebb0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1ebc0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1ebd0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1ebe0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1ebf0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ec00 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1ec10 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1ec20 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1ec30 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1ec40 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1ec50 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1ec60 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1ec70 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1ec80 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1ec90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1eca0 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1ecb0 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
1ecc0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ecd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1ece0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ecf0 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
1ed00 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1ed10 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1ed20 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1ed30 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1ed40 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1ed50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ed60 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1ed70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1ed80 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1ed90 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1eda0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1edb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1edc0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1edd0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1ede0 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1edf0 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1ee00 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1ee10 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1ee20 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1ee30 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1ee40 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1ee50 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1ee60 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1ee70 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1ee80 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1ee90 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1eea0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1eeb0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1eec0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1eed0 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1eee0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
1eef0 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
1ef00 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1ef10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ef20 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
1ef30 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
1ef40 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
1ef50 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
1ef60 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
1ef70 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
1ef80 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
1ef90 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1efa0 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
1efb0 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
1efc0 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
1efd0 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
1efe0 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
1eff0 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
1f000 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
1f010 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
1f020 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1f030 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
1f040 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
1f050 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f080 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f090 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f0a0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f0b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1f0c0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1f0d0 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  ck );..  if( !pP
1f0e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1f0f0 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
1f120 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
1f130 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
1f140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f150 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1f160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f170 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
1f180 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1f190 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1f1a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f1b0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
1f1c0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1f1d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1f1e0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
1f1f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
1f200 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
1f210 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1f220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f230 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
1f240 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1f250 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1f260 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1f270 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a  _EXISTS, &isWal.
1f280 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1f290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f2a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1f2b0 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
1f2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
1f2d0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
1f2e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
1f2f0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  che)==0 );.     
1f300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f310 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
1f320 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  er, 0);.      }e
1f330 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1f340 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1f350 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1f360 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
1f370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1f380 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
1f390 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
1f3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f3c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
1f3d0 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
1f3e0 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
1f3f0 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
1f400 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
1f410 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
1f420 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f430 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
1f440 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
1f450 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
1f460 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
1f470 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
1f480 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
1f490 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
1f4a0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
1f4b0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
1f4c0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
1f4d0 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
1f4e0 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
1f4f0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
1f500 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
1f510 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
1f520 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
1f530 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
1f540 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
1f550 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
1f560 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
1f570 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1f580 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
1f590 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
1f5a0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
1f5b0 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
1f5c0 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
1f5d0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
1f5e0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
1f5f0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
1f600 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
1f610 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
1f620 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f630 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
1f640 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f650 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
1f660 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
1f670 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f680 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
1f690 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
1f6a0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
1f6b0 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
1f6c0 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
1f6d0 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
1f6e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1f6f0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1f700 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1f710 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
1f720 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f730 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
1f740 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
1f750 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1f760 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1f770 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
1f780 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
1f790 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f7a0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
1f7b0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
1f7c0 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
1f7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
1f7e0 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
1f7f0 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
1f800 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
1f810 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
1f820 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
1f830 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
1f840 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
1f850 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
1f860 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
1f870 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1f880 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
1f890 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
1f8a0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
1f8b0 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
1f8c0 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
1f8d0 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
1f8e0 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
1f8f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1f900 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
1f910 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
1f920 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
1f930 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1f940 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
1f950 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
1f960 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
1f970 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
1f980 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
1f990 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
1f9a0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
1f9b0 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
1f9c0 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
1f9d0 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
1f9e0 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
1f9f0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
1fa00 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
1fa10 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
1fa20 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
1fa30 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
1fa40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1fa50 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
1fa60 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
1fa70 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
1fa80 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
1fa90 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
1faa0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
1fab0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
1fac0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
1fad0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
1fae0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
1faf0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1fb00 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
1fb10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
1fb20 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
1fb30 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
1fb40 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
1fb50 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
1fb60 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
1fb70 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
1fb80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fb90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1fba0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
1fbb0 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
1fbc0 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
1fbd0 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
1fbe0 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
1fbf0 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
1fc00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1fc10 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1fc20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fc30 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1fc40 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
1fc50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1fc60 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
1fc70 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
1fc80 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
1fc90 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
1fca0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
1fcb0 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
1fcc0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
1fcd0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
1fce0 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
1fcf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fd00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1fd10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
1fd20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
1fd30 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
1fd40 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
1fd50 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
1fd60 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
1fd70 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
1fd80 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
1fd90 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
1fda0 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
1fdb0 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
1fdc0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1fdd0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1fde0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1fdf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1fe00 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
1fe10 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
1fe20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1fe30 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
1fe40 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
1fe50 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
1fe60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fe70 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
1fe80 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
1fe90 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
1fea0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
1feb0 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
1fec0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1fed0 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
1fee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
1fef0 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
1ff00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
1ff10 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
1ff20 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
1ff30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ff40 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
1ff50 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
1ff60 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1ff70 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
1ff80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1ff90 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
1ffa0 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
1ffb0 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
1ffc0 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1ffd0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1ffe0 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
1fff0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20000 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
20010 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
20020 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
20030 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
20040 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
20050 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20060 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
20070 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
20080 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
20090 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
200a0 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
200b0 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
200c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
200d0 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
200e0 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
200f0 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
20100 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
20110 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
20120 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20130 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
20140 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20150 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
20160 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20170 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
20180 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
20190 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
201a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
201b0 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
201c0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
201d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
201e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
201f0 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
20200 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20210 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20220 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
20230 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
20240 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
20250 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20260 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20270 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
20280 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20290 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
202a0 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
202b0 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
202c0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
202d0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
202e0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
202f0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
20300 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
20310 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
20320 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
20330 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20340 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
20350 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
20360 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
20370 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
20380 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
20390 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
203a0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
203b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
203c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203d0 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
203e0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
203f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20400 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
20410 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
20420 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
20430 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
20440 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
20450 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
20460 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
20470 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
20480 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20490 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
204a0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
204b0 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
204c0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
204d0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
204e0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
204f0 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
20500 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
20510 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
20520 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
20530 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
20540 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
20550 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
20560 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
20570 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
20580 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
20590 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
205a0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
205b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
205c0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
205d0 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
205e0 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
205f0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
20600 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
20610 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
20620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
20630 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
20640 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
20650 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20660 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
20670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20680 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20690 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
206a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
206b0 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
206c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
206d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
206e0 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
206f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
20700 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
20710 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
20720 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
20730 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
20740 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
20750 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
20760 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
20770 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
20780 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
20790 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
207a0 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
207b0 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
207c0 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
207d0 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
207e0 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
207f0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20800 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
20810 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
20820 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20830 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
20840 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  = pSavepoint->iS
20850 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
20860 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
20870 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
20880 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
20890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
208a0 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
208b0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
208c0 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
208d0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
208e0 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
208f0 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
20900 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
20910 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
20920 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
20930 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
20940 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
20950 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
20960 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
20970 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
20980 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
20990 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
209a0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
209b0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
209c0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
209d0 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
209e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
209f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
20a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20a10 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
20a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20a30 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
20a40 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
20a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
20a60 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
20a70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20a80 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
20a90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
20aa0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
20ab0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
20ac0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
20ad0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
20ae0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
20af0 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
20b00 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
20b10 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
20b20 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
20b30 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
20b40 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
20b50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
20b60 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
20b70 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
20b80 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
20b90 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
20ba0 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
20bb0 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
20bc0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
20bd0 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
20be0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
20bf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
20c00 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
20c10 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
20c20 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
20c30 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
20c40 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
20c50 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
20c60 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
20c70 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
20c80 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
20c90 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
20ca0 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
20cb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20cc0 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
20cd0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
20ce0 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
20cf0 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
20d00 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
20d10 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
20d20 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
20d30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
20d50 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
20d60 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
20d70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
20d80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20d90 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
20da0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
20db0 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
20dc0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
20dd0 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
20de0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
20df0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
20e00 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
20e10 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
20e20 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
20e30 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
20e40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
20e50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
20e60 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
20e70 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
20e80 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
20e90 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
20ea0 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
20eb0 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
20ed0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
20ee0 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
20ef0 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
20f00 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
20f10 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
20f20 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
20f30 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
20f40 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
20f50 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
20f60 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
20f70 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
20f80 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
20f90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  ck..**.** The ab
20fa0 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c  ove is for a rol
20fb0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  lback-journal mo
20fc0 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64  de.  For WAL mod
20fd0 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73  e, OFF continues
20fe0 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74  .** to mean that
20ff0 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f   no syncs ever o
21000 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65  ccur.  NORMAL me
21010 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
21020 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72   is synced.** pr
21030 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
21040 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   of checkpoint a
21050 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
21060 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e  base file is syn
21070 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  ced.** at the co
21080 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
21090 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
210a0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
210b0 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77   of the WAL.** w
210c0 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  as written back 
210d0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
210e0 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20  e.  But no sync 
210f0 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
21100 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e   for.** an ordin
21110 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f  ary commit in NO
21120 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57  RMAL mode with W
21130 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20  AL.  FULL means 
21140 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20  that the WAL.** 
21150 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66  file is synced f
21160 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f  ollowing each co
21170 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20  mmit operation, 
21180 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  in addition to t
21190 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f  he.** syncs asso
211a0 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d  ciated with NORM
211b0 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  AL..**.** Do not
211c0 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f   confuse synchro
211d0 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53  nous=FULL with S
211e0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e  QLITE_SYNC_FULL.
211f0 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
21200 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20  SYNC_FULL macro 
21210 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65  means to use the
21220 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75   MacOSX-style fu
21230 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e  ll-fsync.** usin
21240 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53  g fcntl(F_FULLFS
21250 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59  YNC).  SQLITE_SY
21260 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  NC_NORMAL means 
21270 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69  to do an.** ordi
21280 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c  nary fsync() cal
21290 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  l.  There is no 
212a0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
212b0 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  en SQLITE_SYNC_F
212c0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ULL.** and SQLIT
212d0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e  E_SYNC_NORMAL on
212e0 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72   platforms other
212f0 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42   than MacOSX.  B
21300 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72  ut the.** synchr
21310 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75  onous=FULL versu
21320 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  s synchronous=NO
21330 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74  RMAL setting det
21340 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20  ermines when.** 
21350 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74  the xSync primit
21360 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  ive is called an
21370 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  d is relevant to
21380 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a   all platforms..
21390 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
213a0 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
213b0 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
213c0 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
213d0 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
213e0 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
213f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
21400 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
21410 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21420 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50  SafetyLevel(.  P
21430 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
21440 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
21450 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20  r to set safety 
21460 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69  level for */.  i
21470 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20  nt level,       
21480 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73       /* PRAGMA s
21490 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f  ynchronous.  1=O
214a0 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d  FF, 2=NORMAL, 3=
214b0 46 55 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20  FULL */  .  int 
214c0 62 46 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20  bFullFsync,     
214d0 20 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c    /* PRAGMA full
214e0 66 73 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62  fsync */.  int b
214f0 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20  CkptFullFsync   
21500 20 2f 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b   /* PRAGMA check
21510 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20  point_fullfsync 
21520 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
21530 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65  level>=1 && leve
21540 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72  l<=3 );.  pPager
21550 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
21560 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
21570 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
21580 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
21590 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
215a0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
215b0 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66  File) ?1:0;.  if
215c0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
215d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
215e0 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  syncFlags = 0;. 
215f0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
21600 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
21610 7d 65 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46  }else if( bFullF
21620 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
21630 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21640 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21650 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21660 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
21670 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
21680 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70    }else if( bCkp
21690 74 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20  tFullFsync ){.  
216a0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
216b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
216c0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
216d0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
216e0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
216f0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
21700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21710 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21720 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
21730 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21740 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21750 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
21760 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21770 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
21780 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
21790 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
217a0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
217b0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
217c0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
217d0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
217e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
217f0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
21800 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
21810 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
21820 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
21830 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
21840 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
21850 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
21860 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
21870 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
21880 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
21890 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
218a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
218b0 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
218c0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
218d0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
218e0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
218f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
21900 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
21910 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
21920 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
21930 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
21940 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
21950 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
21960 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
21970 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
21980 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
21990 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
219a0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
219b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
219c0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
219d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
219e0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
219f0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
21a00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
21a10 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
21a20 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
21a30 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
21a40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
21a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
21a60 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
21a70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
21a80 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
21a90 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
21aa0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
21ab0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
21ac0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
21ad0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
21ae0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
21af0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
21b00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21b10 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
21b20 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
21b30 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
21b40 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
21b50 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
21b60 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
21b70 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
21b80 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
21b90 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
21ba0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
21bb0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
21bc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
21bd0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
21be0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
21bf0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
21c00 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
21c10 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
21c20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
21c30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21c40 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
21c50 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
21c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21c70 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
21c80 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
21c90 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
21ca0 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
21cb0 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
21cc0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
21cd0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
21ce0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
21cf0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
21d00 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
21d10 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
21d20 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
21d30 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
21d40 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
21d50 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
21d60 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
21d70 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
21d80 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
21d90 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
21da0 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
21db0 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
21dc0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
21dd0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
21de0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
21df0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
21e00 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
21e10 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
21e20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
21e50 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
21e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e90 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
21ea0 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
21eb0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
21ec0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
21ed0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
21ee0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
21ef0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
21f00 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
21f10 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
21f20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
21f30 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
21f40 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
21f50 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
21f60 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
21f70 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
21f80 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
21f90 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
21fa0 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
21fb0 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
21fc0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
21fd0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
21fe0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
21ff0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
22000 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22010 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
22020 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
22030 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
22040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
22050 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
22060 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
22070 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
22080 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22090 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
220a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
220b0 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
220c0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
220d0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
220e0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
220f0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
22100 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
22110 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
22120 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
22130 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
22140 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
22150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
22160 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
22170 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
22180 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
22190 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
221a0 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
221b0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
221c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
221d0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
221e0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
221f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
22200 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
22210 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
22220 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
22230 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
22240 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
22250 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
22260 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
22270 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
22280 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
22290 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
222a0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
222b0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
222c0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
222d0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
222e0 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
222f0 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
22300 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
22310 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
22320 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
22330 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
22340 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
22350 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
22360 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
22370 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
22380 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
22390 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
223a0 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
223b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
223c0 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
223d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
223e0 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
223f0 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
22400 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
22410 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
22420 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
22430 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
22440 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
22450 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
22460 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
22470 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
22480 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
22490 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
224a0 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
224b0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
224c0 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
224d0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
224e0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
224f0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
22500 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
22510 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
22520 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
22530 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
22540 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
22550 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
22560 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
22570 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
22580 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
22590 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
225a0 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
225b0 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
225c0 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
225d0 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
225e0 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
225f0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
22600 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
22610 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
22620 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
22630 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
22640 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
22650 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
22660 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
22670 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
22680 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22690 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
226a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
226b0 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
226c0 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
226d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
226e0 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
226f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
22700 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
22710 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
22720 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
22730 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
22740 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
22750 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
22760 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
22770 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
22780 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
22790 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
227a0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
227b0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
227c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
227d0 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
227e0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
227f0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
22800 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
22810 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
22820 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
22830 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
22840 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
22850 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
22860 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
22870 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
22880 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
22890 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
228a0 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
228b0 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
228c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
228d0 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
228e0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
228f0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
22900 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
22910 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
22920 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
22930 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
22940 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
22950 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22960 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
22970 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
22980 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
22990 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
229a0 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
229b0 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
229c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
229d0 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
229e0 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
229f0 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
22a00 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
22a10 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
22a20 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
22a30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22a40 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
22a50 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
22a60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22a80 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
22a90 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
22aa0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
22ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
22ac0 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
22ad0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
22ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
22b00 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
22b10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
22b20 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
22b30 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65 29 3b  nByte/pageSize);
22b40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
22b50 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
22b60 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
22b70 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
22b80 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
22b90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
22ba0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
22bb0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
22bc0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
22bd0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
22be0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
22bf0 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
22c00 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
22c10 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
22c20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22c30 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
22c40 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
22c50 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
22c60 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
22c70 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
22c80 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
22c90 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
22ca0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
22cb0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
22cc0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
22cd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22ce0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22cf0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
22d00 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
22d10 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
22d20 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
22d30 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
22d40 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
22d50 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
22d60 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
22d70 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
22d80 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
22d90 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
22da0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
22db0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
22dc0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
22dd0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
22de0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
22df0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
22e00 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
22e10 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
22e20 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
22e30 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
22e40 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
22e50 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22e60 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
22e70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
22e80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
22e90 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
22ea0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
22eb0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
22ec0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
22ed0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
22ee0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
22ef0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
22f00 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
22f10 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
22f20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
22f30 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
22f40 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
22f50 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
22f60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
22f70 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
22f80 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
22f90 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
22fa0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
22fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22fc0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
22fd0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
22fe0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22ff0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
23000 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
23010 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
23020 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23030 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
23040 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
23050 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
23060 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
23070 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23080 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
23090 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
230a0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
230b0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
230c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
230d0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
230e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
230f0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
23100 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
23110 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
23120 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
23130 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
23140 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
23150 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
23160 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
23170 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
23180 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
23190 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
231a0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
231b0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
231c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
231d0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
231e0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
231f0 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
23200 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
23210 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
23220 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
23230 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
23240 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
23250 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
23260 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
23270 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23280 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
23290 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
232a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
232b0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
232c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
232d0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
232e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
232f0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
23300 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
23310 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
23320 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
23330 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
23340 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23350 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
23360 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
23370 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
23380 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
23390 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
233a0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
233b0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
233c0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
233d0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
233e0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
233f0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
23400 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
23410 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
23420 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
23430 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
23440 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
23450 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
23460 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
23470 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
23480 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
23490 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
234a0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
234b0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
234c0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
234d0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
234e0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
234f0 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
23500 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
23510 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
23520 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
23530 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
23540 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
23550 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
23560 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
23570 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
23580 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
23590 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
235a0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
235b0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
235c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
235d0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
235e0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
235f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23600 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
23610 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23620 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
23630 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
23640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23650 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
23660 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
23670 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
23680 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
23690 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
236a0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
236b0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
236c0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
236d0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
236e0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
236f0 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
23700 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
23710 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
23720 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
23730 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
23740 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23750 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
23760 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
23770 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23780 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
23790 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
237a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
237b0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
237c0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
237d0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
237e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
237f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
23800 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
23810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23820 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23840 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
23850 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
23860 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
23870 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
23880 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
23890 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
238a0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
238b0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
238c0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
238d0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
238e0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
238f0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
23900 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
23910 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
23920 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
23930 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
23940 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
23950 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
23960 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
23970 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
23980 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
23990 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
239a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
239b0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
239c0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
239d0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
239e0 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
239f0 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
23a00 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
23a10 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
23a20 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
23a30 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
23a40 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
23a50 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
23a60 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
23a70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
23a80 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
23a90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
23aa0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
23ab0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
23ac0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
23ad0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
23ae0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
23af0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
23b00 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
23b10 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
23b20 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
23b30 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
23b40 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
23b50 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
23b60 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
23b70 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
23b80 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
23b90 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
23ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
23bb0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
23bc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
23bd0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
23be0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
23bf0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
23c00 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
23c10 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
23c20 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
23c30 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
23c40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23c60 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
23c70 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
23c80 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
23c90 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
23cc0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
23cd0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
23ce0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
23cf0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
23d00 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
23d10 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
23d20 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
23d30 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
23d40 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
23d50 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
23d60 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
23d70 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
23d80 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
23d90 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
23da0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
23db0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
23dc0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
23dd0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
23de0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
23df0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
23e00 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
23e10 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
23e20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
23e30 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
23e40 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
23e50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
23e60 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
23e70 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
23e80 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
23e90 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
23ea0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
23eb0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23ec0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
23ed0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
23ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23ef0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
23f00 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
23f10 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
23f20 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
23f30 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
23f40 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
23f50 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
23f60 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
23f70 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
23f80 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
23f90 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
23fa0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
23fb0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
23fc0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
23fd0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
23fe0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
23ff0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
24000 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
24010 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
24020 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
24030 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
24040 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
24050 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
24060 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
24070 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
24080 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
24090 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
240a0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
240b0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
240c0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
240d0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
240e0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
240f0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
24100 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
24110 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
24120 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
24130 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
24140 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
24150 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
24160 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
24170 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
24180 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
24190 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
241a0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
241b0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
241c0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
241d0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
241e0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
241f0 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
24200 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
24210 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
24220 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
24230 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
24240 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
24250 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
24260 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
24270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24280 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
24290 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
242a0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
242b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
242c0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
242d0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
242e0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
242f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
24300 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
24310 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
24320 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
24330 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
24340 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
24350 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
24360 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
24370 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
24380 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
24390 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
243a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
243b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
243c0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
243d0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
243e0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
243f0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
24400 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
24410 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
24420 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
24430 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
24440 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24450 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
24460 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
24470 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
24480 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
24490 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
244a0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
244b0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
244c0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
244d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
244e0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
244f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
24500 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
24510 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
24520 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
24530 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
24540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24550 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
24560 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
24570 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
24580 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
24590 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
245a0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
245b0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
245c0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
245d0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
245e0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
245f0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
24600 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
24610 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
24620 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
24630 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
24640 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
24650 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
24660 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
24670 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
24680 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
24690 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63  e;.  assertTrunc
246a0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
246b0 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
246c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
246d0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
246e0 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
246f0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
24700 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
24710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
24720 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
24730 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
24740 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
24750 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
24760 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
24770 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
24780 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
24790 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
247a0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
247b0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
247c0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
247d0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
247e0 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
247f0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
24800 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
24810 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
24820 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
24830 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
24840 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
24850 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
24860 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
24870 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
24880 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
24890 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
248a0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
248b0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
248c0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
248d0 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
248e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
248f0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
24900 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
24910 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
24920 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24930 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
24940 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24950 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24960 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
24970 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
24980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24990 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
249a0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
249b0 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
249c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
249d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
249e0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
249f0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
24a00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
24a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
24a30 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
24a40 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
24a50 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
24a60 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
24a70 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
24a80 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
24a90 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
24aa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
24ab0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
24ac0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
24ad0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
24ae0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
24af0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
24b00 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
24b10 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
24b20 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
24b30 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
24b40 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
24b50 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
24b60 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
24b70 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
24b80 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
24b90 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
24ba0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
24bb0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
24bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
24bd0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
24be0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
24bf0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
24c00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24c10 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
24c20 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
24c30 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
24c40 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
24c50 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
24c60 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
24c70 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
24c80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24c90 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
24ca0 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
24cb0 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
24cc0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
24cd0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
24ce0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
24cf0 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
24d00 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24d10 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
24d20 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
24d30 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  oc();.  /* pPage
24d40 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
24d50 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
24d60 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
24d70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24d80 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65  MIT_WAL.  sqlite
24d90 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
24da0 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ->pWal, pPager->
24db0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
24dc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
24dd0 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72   pTmp);.  pPager
24de0 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
24df0 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
24e00 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
24e10 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
24e20 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
24e30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24e40 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
24e50 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
24e60 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
24e70 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
24e80 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
24e90 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
24ea0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
24eb0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
24ec0 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
24ed0 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
24ee0 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
24ef0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
24f00 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
24f10 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
24f20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
24f30 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
24f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
24f50 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
24f60 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
24f70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
24f80 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
24f90 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
24fa0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
24fb0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
24fc0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
24fd0 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
24fe0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
24ff0 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
25000 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
25010 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
25020 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
25030 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
25040 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
25050 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
25060 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
25070 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
25080 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
25090 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
250a0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
250b0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
250c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
250d0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
250e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
250f0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
25100 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
25110 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
25120 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
25130 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
25140 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
25150 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
25160 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
25170 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
25180 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25190 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
251a0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
251b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
251c0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
251d0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
251e0 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
251f0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
25200 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
25210 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
25220 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
25230 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
25240 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
25250 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
25260 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
25270 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
25280 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
25290 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
252a0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
252b0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
252c0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
252d0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
252e0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
252f0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
25300 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
25310 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
25320 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
25330 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
25340 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
25350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25360 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
25370 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
25380 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
25390 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
253a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
253b0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
253c0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
253d0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
253e0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
253f0 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
25400 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
25410 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
25420 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
25430 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
25440 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
25450 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
25460 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
25470 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
25480 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
25490 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
254a0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
254b0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
254c0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
254d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
254e0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
254f0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
25500 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
25510 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
25520 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
25530 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
25540 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
25550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
25560 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
25570 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
25580 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25590 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
255a0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
255b0 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
255c0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
255d0 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
255e0 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
255f0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
25600 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
25610 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25620 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
25630 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
25640 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
25650 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
25660 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
25670 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
25680 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
25690 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
256a0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
256b0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
256c0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
256d0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
256e0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
256f0 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
25700 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
25710 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
25720 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
25730 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
25740 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
25750 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
25760 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
25770 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
25780 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
25790 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
257a0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
257b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
257c0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
257d0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
257e0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
257f0 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
25800 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
25810 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
25820 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
25830 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
25840 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
25850 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
25860 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
25870 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
25880 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
25890 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
258a0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
258b0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
258c0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
258d0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
258e0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
258f0 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
25900 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
25910 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
25920 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
25930 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
25940 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
25950 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
25960 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
25970 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
25980 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
25990 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
259a0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
259b0 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
259c0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
259d0 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
259e0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
259f0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
25a00 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25a10 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
25a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25a30 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
25a40 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
25a50 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
25a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25a80 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
25a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25aa0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
25ab0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
25ac0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
25ad0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
25ae0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
25af0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
25b00 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
25b10 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
25b20 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25b30 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
25b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
25b50 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
25b60 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
25b70 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25b80 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
25b90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
25ba0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
25bb0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
25bc0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
25bd0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
25be0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25bf0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
25c00 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
25c10 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
25c20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
25c30 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25c40 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
25c50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25c60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25c70 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
25c80 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
25c90 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
25ca0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
25cb0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
25cc0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
25cd0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
25ce0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
25cf0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
25d00 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
25d10 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
25d20 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
25d30 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
25d40 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
25d50 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25d60 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
25d70 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
25d80 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
25d90 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
25da0 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
25db0 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
25dc0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
25dd0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
25de0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
25df0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
25e00 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
25e10 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
25e20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
25e30 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
25e40 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
25e50 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
25e60 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
25e70 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
25e80 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
25e90 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
25ea0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
25eb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
25ec0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
25ed0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
25ee0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
25ef0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
25f00 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
25f10 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
25f20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
25f30 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
25f40 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
25f50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
25f60 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
25f70 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
25f80 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
25f90 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
25fa0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
25fb0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
25fc0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
25fd0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
25fe0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
25ff0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
26000 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
26010 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
26020 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26030 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
26040 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
26050 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
26060 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
26070 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
26080 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
26090 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
260a0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
260b0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
260c0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
260d0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
260e0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
260f0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
26100 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26110 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
26120 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
26130 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
26140 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
26150 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
26160 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
26170 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
26180 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
26190 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
261a0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
261b0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
261c0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
261d0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
261e0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
261f0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
26200 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
26210 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
26220 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
26230 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
26240 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
26250 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
26260 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
26270 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
26280 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
26290 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
262a0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
262b0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
262c0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
262d0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
262e0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
262f0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
26300 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
26310 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
26320 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
26330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26340 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
26350 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
26360 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26370 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26380 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
26390 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
263a0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
263b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
263c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
263d0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
263e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
263f0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
26400 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
26410 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
26420 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
26430 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26440 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
26450 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
26460 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
26470 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26480 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26490 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
264a0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
264b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
264c0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
264d0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
264e0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
264f0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26500 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
26510 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
26520 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
26530 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
26540 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
26550 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
26560 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
26570 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
26580 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
26590 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
265a0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
265b0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
265c0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
265d0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
265e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
265f0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
26600 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
26610 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
26620 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
26630 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
26640 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
26650 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
26660 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
26670 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
26680 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
26690 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
266a0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
266b0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
266c0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
266d0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
266e0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
266f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
26700 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
26710 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
26720 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
26730 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
26740 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
26750 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
26760 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26770 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
26780 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
26790 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
267a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
267b0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
267c0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
267d0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
267e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
267f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26800 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
26810 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
26820 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
26830 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
26840 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
26850 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
26860 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
26870 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
26880 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
26890 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
268a0 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
268b0 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
268c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
268d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
268e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
268f0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
26900 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
26910 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
26920 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
26930 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
26940 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
26950 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
26960 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
26970 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
26980 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
26990 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
269a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
269b0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
269c0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
269d0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
269e0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
269f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
26a00 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
26a10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26a20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26a40 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
26a50 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
26a60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26a70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
26a80 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
26a90 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
26aa0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
26ab0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
26ac0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
26ad0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
26ae0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
26af0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26b00 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26b20 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
26b30 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26b50 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
26b60 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
26b70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
26b80 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
26b90 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
26ba0 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
26bb0 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
26bc0 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
26bd0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
26be0 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
26bf0 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
26c00 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26c10 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
26c20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
26c30 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
26c40 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
26c50 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
26c60 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
26c70 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
26c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
26ca0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
26cb0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
26cc0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
26cd0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
26ce0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
26cf0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
26d00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
26d10 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
26d20 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
26d30 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
26d40 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
26d50 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
26d60 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
26d70 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
26d80 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
26d90 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
26da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26db0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
26dc0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
26dd0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
26de0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
26df0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
26e00 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
26e10 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
26e20 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
26e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
26e40 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
26e50 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
26e60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
26e70 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
26e80 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
26e90 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
26ea0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
26eb0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
26ec0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26ed0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
26ee0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
26ef0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
26f00 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
26f10 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
26f20 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
26f30 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
26f40 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
26f50 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
26f60 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
26f70 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
26f80 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
26f90 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
26fa0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
26fb0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
26fc0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
26fd0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
26fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
26ff0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
27000 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
27010 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
27020 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
27030 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
27040 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
27050 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
27060 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
27070 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
27080 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
27090 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
270a0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
270b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
270c0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
270d0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
270e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
270f0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
27100 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
27110 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
27120 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
27130 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
27140 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
27150 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
27160 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
27170 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
27180 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
27190 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
271a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
271b0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
271c0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
271d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
271e0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
271f0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
27200 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
27210 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
27220 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
27230 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
27240 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
27250 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
27260 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
27270 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
27280 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
27290 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
272a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
272b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
272e0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
272f0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
27300 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
27310 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
27320 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
27330 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
27340 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27350 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27360 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27370 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
27380 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
27390 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
273a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
273b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
273c0 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
273d0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
273e0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
273f0 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
27400 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
27410 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
27420 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
27430 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
27440 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
27450 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
27460 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
27470 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
27480 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
27490 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
274a0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
274b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
274c0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
274d0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
274e0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
274f0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
27500 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
27510 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
27520 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
27530 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
27540 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
27550 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
27560 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
27570 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
27580 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
27590 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
275a0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
275b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
275c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
275d0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
275e0 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ze ){.    sqlite
275f0 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
27600 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27610 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
27620 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
27630 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
27640 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
27650 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
27660 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
27670 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
27680 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
27690 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
276a0 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
276b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
276c0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
276d0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
276e0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
276f0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
27700 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
27710 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
27720 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
27730 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
27740 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
27750 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
27760 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
27770 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
27780 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
27790 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
277a0 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
277b0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
277c0 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
277d0 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
277e0 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
277f0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
27800 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
27810 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
27820 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
27830 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
27840 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
27850 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
27860 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
27870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27880 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
27890 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
278a0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
278b0 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
278c0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
278d0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
278e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
278f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
27900 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
27910 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27940 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
27950 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
27960 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
27970 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
27980 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
27990 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
279a0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
279b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
279c0 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
279d0 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
279e0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
279f0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
27a00 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
27a10 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
27a20 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
27a30 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
27a40 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
27a50 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
27a60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
27a70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
27a80 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
27a90 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
27aa0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
27ab0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
27ac0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
27ad0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
27ae0 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
27af0 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
27b00 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
27b10 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
27b20 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
27b30 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
27b40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27b50 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
27b60 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
27b70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27b80 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
27b90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
27ba0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
27bb0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
27bc0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
27bd0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
27be0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
27bf0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
27c00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
27c10 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
27c20 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
27c30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  }..      /* Upda
27c40 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
27c50 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
27c60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
27c70 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
27c80 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
27c90 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
27ca0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
27cb0 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
27cc0 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
27cd0 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
27ce0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
27cf0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
27d00 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
27d10 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
27d20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
27d30 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
27d40 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
27d50 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
27d60 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
27d70 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
27d80 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
27d90 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
27da0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
27db0 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65  >nWrite);.    }e
27dc0 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
27dd0 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
27de0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
27df0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27e00 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
27e10 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
27e20 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
27e30 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
27e40 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
27e50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27e60 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
27e70 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
27e80 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
27e90 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
27ea0 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
27eb0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
27ec0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
27ed0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
27ee0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
27ef0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
27f00 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
27f10 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
27f20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27f30 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
27f40 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
27f50 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
27f60 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
27f70 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
27f80 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27f90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27fa0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
27fb0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
27fc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
27fd0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
27fe0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
27ff0 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
28000 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
28010 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
28020 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
28030 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
28040 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
28050 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
28060 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
28070 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
28080 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
28090 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
280a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
280b0 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
280c0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
280d0 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
280e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
280f0 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63   .** It is the c
28100 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
28110 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62  ility to use sub
28120 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20  jRequiresPage() 
28130 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61  to check .** tha
28140 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
28150 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63  equired before c
28160 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
28170 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tion..**.** If s
28180 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
28190 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
281a0 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
281b0 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
281c0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
281d0 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
281e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
281f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28200 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
28210 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
28220 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
28230 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
28240 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
28250 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
28260 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
28270 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
28280 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
28290 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
282a0 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
282b0 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
282c0 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
282d0 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
282e0 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
282f0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
28300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
28310 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
28320 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
28330 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28340 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
28350 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20  ALMODE_OFF ){.. 
28360 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
28370 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
28380 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
28390 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f  y been opened */
283a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
283b0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
283c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
283d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
283e0 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  d) || pagerUseWa
283f0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
28400 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28410 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c  pPager->sjfd) ||
28420 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
28430 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
28440 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
28450 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20  Pager) .        
28460 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61   || pageInJourna
28470 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  l(pPg) .        
28480 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
28490 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
284a0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
284b0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
284c0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
284d0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
284e0 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
284f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
28500 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
28510 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
28520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
28530 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
28540 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
28550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28560 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
28570 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
28580 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
28590 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
285a0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
285b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
285c0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
285d0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
285e0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
285f0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
28600 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
28610 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
28620 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
28630 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
28640 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28650 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28660 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
28670 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
28680 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
28690 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
286a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
286b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
286c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
286d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
286e0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
286f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
28700 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
28710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
28740 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
28750 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
28760 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
28770 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
28780 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
28790 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
287a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
287b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
287c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
287d0 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
287e0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
287f0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
28800 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
28810 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
28820 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
28830 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
28840 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
28850 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
28860 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
28870 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
28880 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
28890 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
288a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
288b0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
288c0 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
288d0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
288e0 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
288f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
28900 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
28910 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
28920 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
28930 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
28940 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
28950 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
28960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
28970 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
28980 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
28990 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
289a0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
289b0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
289c0 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
289d0 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
289e0 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
289f0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
28a00 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
28a10 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
28a20 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
28a30 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
28a40 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
28a50 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
28a60 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
28a70 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
28a80 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
28a90 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
28aa0 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
28ab0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28ac0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
28ad0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
28ae0 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
28af0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
28b00 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
28b10 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
28b20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
28b30 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
28b40 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
28b50 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
28b60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
28b70 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
28b80 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
28b90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
28ba0 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
28bb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28bc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
28bd0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
28be0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
28bf0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
28c00 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
28c10 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c  oNotSyncSpill fl
28c20 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  ag is set during
28c30 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
28c40 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
28c50 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
28c60 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
28c70 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
28c80 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
28c90 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
28ca0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
28cb0 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
28cc0 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
28cd0 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
28ce0 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
28cf0 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
28d00 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
28d10 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67   doNotSpill flag
28d20 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
28d30 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67  che spilling reg
28d40 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
28d50 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61  er.  ** or not a
28d60 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
28d70 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
28d80 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
28d90 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  k..  **.  ** Spi
28da0 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
28db0 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
28dc0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
28dd0 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
28de0 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
28df0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
28e00 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
28e10 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f  ent implementato
28e20 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
28e30 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
28e40 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
28e50 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
28e60 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
28e70 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  1.  ** while in 
28e80 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
28e90 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
28ea0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
28eb0 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
28ec0 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
28ed0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
28ee0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
28ef0 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
28f00 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
28f10 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
28f20 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
28f30 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
28f40 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
28f50 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
28f60 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
28f70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28f80 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
28f90 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20  tSpill ) return 
28fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
28fb0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
28fc0 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d  ncSpill && (pPg-
28fd0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
28fe0 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a  EED_SYNC)!=0 ){.
28ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29000 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
29010 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
29020 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
29030 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
29040 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
29050 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
29060 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
29070 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
29080 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29090 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
290a0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
290b0 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
290c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
290d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
290e0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
290f0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
29100 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
29110 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
29120 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
29130 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
29140 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
29150 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
29160 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
29170 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
29180 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
29190 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
291a0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
291b0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
291c0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
291d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
291e0 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
291f0 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
29200 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
29210 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
29220 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
29230 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
29240 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
29250 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
29260 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
29270 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
29280 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29290 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
292a0 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
292b0 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
292c0 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
292d0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
292e0 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
292f0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
29300 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
29310 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
29320 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
29330 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
29340 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
29350 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
29360 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
29370 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
29380 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
29390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
293a0 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
293b0 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
293c0 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
293d0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
293e0 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
293f0 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
29400 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
29410 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
29420 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
29430 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
29440 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
29450 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
29460 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
29470 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
29480 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
29490 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
294a0 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
294b0 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
294c0 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
294d0 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
294e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
294f0 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
29500 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
29510 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
29520 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
29530 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
29540 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
29550 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
29560 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
29570 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
29580 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
29590 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
295a0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
295b0 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
295c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
295d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
295e0 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
295f0 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
29600 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
29610 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
29620 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
29630 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
29640 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
29650 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
29660 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
29670 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
29680 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
29690 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
296a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
296b0 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
296c0 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
296d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
296e0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
296f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
29700 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
29710 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
29720 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29730 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
29740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
29760 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
29770 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
29780 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
29790 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
297a0 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
297b0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
297c0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
297d0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
297e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
297f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
29800 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
29810 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29820 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29830 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
29840 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
29850 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
29860 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
29870 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
29880 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  c); .}.../*.** A
29890 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
298a0 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
298b0 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
298c0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
298d0 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
298e0 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
298f0 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
29900 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
29910 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
29920 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
29930 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
29940 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
29950 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
29960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29970 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
29980 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
29990 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
299a0 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
299b0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
299c0 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
299d0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
299e0 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
299f0 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
29a00 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
29a10 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
29a20 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
29a30 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
29a40 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
29a50 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
29a60 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
29a70 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
29a80 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
29a90 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
29aa0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
29ab0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
29ac0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
29ad0 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
29ae0 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
29af0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
29b00 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
29b10 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
29b20 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
29b30 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
29b40 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
29b50 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
29b60 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
29b70 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
29b80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
29b90 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
29ba0 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
29bb0 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
29bc0 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
29bd0 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
29be0 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
29bf0 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
29c00 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
29c10 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
29c20 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
29c30 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
29c40 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  CK flags..**.** 
29c50 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
29c60 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
29c70 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
29c80 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
29c90 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
29ca0 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
29cb0 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
29cc0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
29cd0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
29ce0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
29cf0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
29d00 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
29d10 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
29d20 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
29d30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29d40 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
29d50 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
29d60 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
29d70 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
29d80 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
29d90 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
29da0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
29db0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
29dc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
29dd0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
29de0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
29df0 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
29e00 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
29e10 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
29e20 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
29e30 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
29e40 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
29e50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
29e60 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
29e70 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
29e80 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
29e90 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
29ea0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
29eb0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
29ec0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
29ed0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
29ee0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
29ef0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
29f00 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
29f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29f20 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
29f30 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
29f40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
29f50 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
29f60 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
29f70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
29f80 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
29f90 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
29fa0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
29fb0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
29fc0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
29fd0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
29fe0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
29ff0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2a000 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2a010 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2a020 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2a030 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2a040 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2a050 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a060 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2a070 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2a080 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2a090 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2a0a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a0b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a0c0 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2a0d0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2a0e0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2a0f0 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2a100 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2a110 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2a120 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2a130 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2a140 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2a150 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2a160 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2a170 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2a180 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2a190 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2a1a0 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2a1b0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2a1c0 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2a1d0 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2a1e0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2a1f0 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2a200 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2a210 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2a220 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a240 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2a250 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2a260 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2a270 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2a280 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2a290 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2a2a0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52  nal */.  int noR
2a2b0 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
2a2c0 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
2a2d0 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72  LOCK)!=0;  /* Tr
2a2e0 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d  ue to omit read-
2a2f0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63  lock */.  int pc
2a300 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2a310 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2a320 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2a330 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2a340 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2a350 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2a360 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2a370 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2a380 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2a390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2a3a0 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2a3b0 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2a3c0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a3e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2a3f0 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2a400 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2a410 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2a420 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2a430 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2a440 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2a450 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2a460 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2a470 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2a480 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2a490 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
2a4a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
2a4b0 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
2a4c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2a4d0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2a4e0 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
2a4f0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2a500 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
2a510 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
2a520 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
2a530 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
2a540 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
2a550 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
2a560 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
2a570 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
2a580 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
2a590 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
2a5a0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2a5b0 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
2a5c0 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
2a5d0 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
2a5e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
2a5f0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
2a600 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2a610 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
2a620 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2a630 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2a640 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2a650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
2a660 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2a670 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
2a680 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
2a690 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2a6a0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2a6b0 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2a6c0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2a6d0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2a6e0 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2a6f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2a700 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2a710 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2a720 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2a730 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  1;.    zFilename
2a740 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2a750 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2a760 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2a770 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2a780 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2a790 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2a7a0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2a7b0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2a7c0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2a7d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2a7e0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2a7f0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2a800 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2a810 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2a820 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2a830 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2a840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2a850 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2a860 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a870 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2a880 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
2a890 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
2a8a0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2a8b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2a8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a8d0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2a8e0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2a8f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2a900 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2a910 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2a920 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2a930 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2a940 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2a950 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2a960 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2a970 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2a980 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2a990 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2a9a0 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2a9b0 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2a9c0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2a9d0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2a9e0 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2a9f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2aa00 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2aa10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2aa20 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2aa30 20 6e 55 72 69 20 3d 20 26 7a 5b 31 5d 20 2d 20   nUri = &z[1] - 
2aa40 7a 55 72 69 3b 0a 20 20 20 20 69 66 28 20 72 63  zUri;.    if( rc
2aa50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2aa60 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2aa70 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2aa80 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2aa90 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2aaa0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2aab0 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2aac0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2aad0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2aae0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2aaf0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2ab00 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2ab10 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2ab20 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2ab30 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2ab40 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2ab50 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2ab60 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2ab70 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2ab80 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2ab90 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2aba0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2abb0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2abc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2abd0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2abe0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2abf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ac00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2ac10 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
2ac20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2ac30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2ac40 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2ac50 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2ac60 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2ac70 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2ac80 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2ac90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2aca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2acb0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2acc0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2acd0 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2ace0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2acf0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2ad00 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2ad10 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2ad20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2ad30 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2ad40 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2ad50 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2ad60 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2ad70 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2ad80 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2ad90 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2ada0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2adb0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2adc0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2add0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2ade0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2adf0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2ae00 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2ae10 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2ae20 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2ae30 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2ae40 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2ae50 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2ae60 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2ae70 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2ae80 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2ae90 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2aeb0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2aec0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2aed0 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2aee0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2aef0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2af00 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2af10 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2af20 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2af30 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2af40 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2af50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2af60 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2af70 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2af80 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2af90 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2afa0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2afb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2afc0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2afd0 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2afe0 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2aff0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2b000 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2b010 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
2b020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2b030 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2b040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2b050 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2b060 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20  e + 4 + 1       
2b070 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2b080 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2b090 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2b0a0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2b0b0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2b0c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2b0d0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2b0e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2b0f0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
2b100 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b110 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
2b120 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
2b130 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
2b140 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
2b150 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
2b160 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
2b170 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2b180 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
2b190 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
2b1a0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b1b0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2b1c0 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
2b1d0 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
2b1e0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2b1f0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2b200 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
2b210 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
2b220 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b230 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b240 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
2b250 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
2b260 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
2b270 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2b280 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2b290 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
2b2a0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
2b2b0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
2b2c0 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
2b2d0 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
2b2e0 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
2b2f0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
2b300 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
2b310 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e    assert( nPathn
2b320 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  ame>0 );.    pPa
2b330 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
2b340 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2b350 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20  = nPathname + 1 
2b360 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  + nUri);.    mem
2b370 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2b380 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2b390 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2b3a0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b3b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2b3c0 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2b3d0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2b3e0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2b3f0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2b400 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2b410 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2b420 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2b430 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
2b440 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  8);.    sqlite3F
2b450 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2b460 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2b470 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2b480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b490 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2b4a0 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2b4b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2b4c0 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2b4d0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2b4e0 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2b4f0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2b500 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b510 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2b520 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20  ], "-wal", 4);. 
2b530 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2b540 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2b550 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2b560 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2b570 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b580 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2b590 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2b5a0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2b5b0 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2b5c0 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2b5d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2b5e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2b5f0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2b600 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2b610 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b630 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2b640 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2b650 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b660 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2b670 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b680 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2b690 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2b6a0 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2b6b0 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2b6c0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2b6d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2b6e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b6f0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2b700 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2b710 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2b720 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2b730 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2b740 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2b750 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2b760 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2b770 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2b780 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2b790 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2b7a0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2b7b0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2b7c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2b7d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2b7e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2b7f0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2b800 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2b810 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2b820 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2b830 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2b840 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2b850 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b860 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
2b870 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
2b880 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2b890 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
2b8a0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2b8b0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2b8c0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2b8d0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2b8e0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2b8f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2b900 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
2b910 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2b920 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2b930 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2b940 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2b950 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2b960 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2b970 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2b980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b990 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2b9a0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2b9b0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2b9c0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
2b9d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b9e0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2b9f0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
2ba00 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2ba10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2ba20 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2ba30 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2ba40 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
2ba50 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2ba60 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2ba70 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2ba80 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2ba90 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2baa0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2bab0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2bac0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2bad0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2bae0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2baf0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2bb00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2bb10 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2bb20 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
2bb30 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2bb40 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2bb50 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2bb60 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2bb70 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
2bb80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bb90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2bba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2bbb0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2bbc0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2bbd0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2bbe0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2bbf0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2bc00 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2bc10 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2bc20 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2bc30 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2bc40 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2bc50 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2bc60 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2bc70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2bc80 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2bc90 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2bca0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2bcb0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2bcc0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2bcd0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2bce0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2bcf0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2bd00 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2bd10 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2bd20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2bd30 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2bd40 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
2bd50 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2bd60 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2bd70 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
2bd80 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2bd90 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
2bda0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2bdb0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2bdc0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2bdd0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2bde0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2bdf0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2be00 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2be10 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2be20 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2be30 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2be40 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2be50 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2be60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2be70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2be80 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2be90 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2bea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2beb0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2bec0 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2bed0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2bee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bef0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2bf00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2bf10 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
2bf20 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
2bf30 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
2bf40 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2bf50 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2bf60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2bf70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bf80 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2bf90 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
2bfa0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2bfb0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2bfc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2bfd0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2bfe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2bff0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2c000 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2c010 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
2c020 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2c030 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2c040 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
2c050 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2c060 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2c070 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2c090 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2c0a0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2c0b0 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2c0c0 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
2c0d0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2c0e0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2c0f0 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2c100 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2c110 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2c120 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2c130 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2c140 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2c150 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2c160 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2c170 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
2c180 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
2c190 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
2c1a0 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
2c1b0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2c1c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c1d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2c1e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c1f0 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2c200 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2c210 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2c220 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2c230 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2c240 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2c250 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2c260 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2c270 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2c280 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c290 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2c2a0 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  CK; */.#if 0.  a
2c2b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2c2c0 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
2c2d0 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
2c2e0 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
2c2f0 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  CK) );.#endif.  
2c300 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2c310 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2c320 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2c330 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2c340 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2c350 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2c360 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2c370 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2c380 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2c390 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2c3a0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2c3b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2c3c0 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2c3d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2c3e0 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2c3f0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2c400 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2c410 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2c420 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2c430 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2c440 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2c450 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2c460 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2c470 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2c480 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2c490 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2c4a0 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2c4b0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2c4c0 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65  fullSync = pPage
2c4d0 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a  r->noSync ?0:1;.
2c4e0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2c4f0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ags = pPager->no
2c500 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54  Sync ? 0 : SQLIT
2c510 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2c520 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2c530 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d  cFlags = pPager-
2c540 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 2f 2a  >syncFlags;.  /*
2c550 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2c560 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c570 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2c580 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2c590 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2c5a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2c5b0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2c5c0 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2c5d0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2c5e0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2c5f0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2c600 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2c610 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2c620 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2c630 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2c640 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2c650 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2c660 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c670 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2c680 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2c690 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2c6a0 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2c6b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2c6c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c6d0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2c6e0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2c6f0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2c700 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2c710 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2c720 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2c730 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2c740 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2c750 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2c760 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2c770 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
2c780 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2c790 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2c7a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2c7b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2c7c0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2c7d0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2c7e0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2c7f0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2c800 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2c810 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2c820 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2c830 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2c840 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2c850 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2c860 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2c870 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2c880 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2c890 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2c8a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2c8b0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2c8c0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2c8d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c8e0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2c8f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2c900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2c910 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2c920 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2c930 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2c940 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2c950 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2c960 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c970 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2c980 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2c990 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2c9a0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2c9b0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2c9c0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2c9d0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2c9e0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2c9f0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2ca00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2ca10 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2ca20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ca30 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2ca40 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2ca50 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2ca60 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2ca70 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2ca80 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2ca90 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2caa0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2cab0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2cac0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2cad0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2cae0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2caf0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2cb00 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2cb10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2cb20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2cb30 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2cb40 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2cb50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2cb60 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2cb70 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2cb80 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2cb90 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2cba0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2cbb0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2cbc0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2cbd0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2cbe0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2cbf0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2cc00 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2cc10 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2cc20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2cc30 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2cc40 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2cc50 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2cc60 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2cc70 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2cc80 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2cc90 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2cca0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2ccb0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2ccc0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2ccd0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2cce0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2ccf0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2cd00 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2cd10 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2cd20 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2cd30 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2cd40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2cd50 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2cd60 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2cd70 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2cd80 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2cd90 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2cda0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2cdb0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2cdc0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2cdd0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2cde0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2cdf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2ce00 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2ce10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2ce20 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2ce30 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2ce40 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2ce50 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2ce60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2ce70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ce80 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2ce90 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2cea0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ceb0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2cec0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2ced0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2cee0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2cef0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2cf00 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2cf10 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2cf20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2cf30 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2cf40 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2cf50 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2cf60 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2cf70 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2cf80 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2cf90 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2cfa0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2cfb0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2cfc0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2cfd0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2cfe0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2cff0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2d000 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2d010 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2d020 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2d030 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2d040 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2d050 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d060 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2d070 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2d080 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d090 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2d0a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2d0b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2d0c0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2d0d0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2d0e0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2d0f0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2d100 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2d110 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2d120 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2d130 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2d140 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2d150 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2d160 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2d170 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2d180 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2d190 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2d1a0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2d1b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2d1c0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2d1d0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2d1e0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2d1f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2d200 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2d210 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2d220 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2d230 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2d240 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2d250 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2d260 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2d270 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2d280 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2d290 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2d2a0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2d2b0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2d2c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d2d0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2d2e0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2d2f0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2d300 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d310 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2d320 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2d330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d340 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2d350 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2d360 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2d370 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2d380 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2d390 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2d3a0 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2d3b0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2d3c0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2d3d0 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2d3e0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2d3f0 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2d400 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2d410 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2d420 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2d430 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2d440 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2d450 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2d460 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2d470 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2d480 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2d490 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2d4a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2d4b0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2d4c0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2d4d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2d4e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d4f0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2d500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2d510 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2d520 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2d530 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2d540 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2d550 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2d560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d570 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2d580 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2d590 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2d5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d5b0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2d5c0 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2d5d0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2d5e0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2d5f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d600 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2d610 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2d620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2d640 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2d650 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2d660 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2d670 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2d680 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2d690 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2d6a0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2d6b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2d6c0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2d6d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2d6e0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2d6f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2d700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2d710 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2d720 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2d730 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2d740 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2d750 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2d760 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2d770 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2d780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d790 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2d7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2d7b0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2d7c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2d7d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2d7e0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2d7f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d800 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2d810 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2d820 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2d830 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d840 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2d850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d860 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2d870 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2d880 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d890 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2d8a0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2d8b0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2d8c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d8d0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2d8e0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2d8f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d900 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d920 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2d930 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d940 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2d950 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2d960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d970 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2d980 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2d990 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2d9b0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2d9c0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2d9d0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2d9e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2d9f0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2da00 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2da10 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2da20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2da30 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2da40 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2da50 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2da60 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2da70 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2da80 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2da90 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2daa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2dab0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2dac0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2dad0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2dae0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2daf0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2db00 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2db10 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2db20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2db30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2db40 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2db50 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2db60 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2db70 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2db80 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2db90 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2dba0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2dbb0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2dbc0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2dbd0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2dbe0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2dbf0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2dc00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2dc10 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2dc20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2dc30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2dc40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2dc50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dc60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2dc70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2dc80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2dc90 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2dca0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2dcb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2dcc0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2dcd0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2dce0 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2dcf0 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2dd00 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2dd10 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2dd20 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2dd30 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2dd40 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2dd50 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2dd60 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2dd70 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2dd80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2dd90 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2dda0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2ddb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2ddc0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2ddd0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2dde0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2ddf0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2de00 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2de10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2de20 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2de30 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2de40 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2de50 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2de60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2de70 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2de80 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2de90 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2dea0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2deb0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2dec0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2ded0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2dee0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2def0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2df00 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2df10 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2df20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2df30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2df40 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2df50 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2df60 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2df70 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2df80 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2df90 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2dfa0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2dfb0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2dfc0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2dfd0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2dfe0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2dff0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2e000 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2e010 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2e020 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2e030 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2e040 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2e050 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2e060 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2e070 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2e080 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2e090 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2e0a0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2e0b0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2e0c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2e0d0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2e0e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2e0f0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2e100 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2e110 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2e120 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2e130 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e140 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2e150 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2e160 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2e170 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2e180 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2e190 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2e1a0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2e1b0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2e1c0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2e1d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2e1e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e1f0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2e200 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e210 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e220 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e230 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2e240 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2e250 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2e260 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2e270 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2e280 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2e290 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2e2a0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2e2b0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2e2c0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2e2d0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2e2e0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2e2f0 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2e300 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2e310 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2e320 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2e330 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2e340 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e350 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2e360 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2e370 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2e380 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2e390 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2e3a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e3b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2e3c0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2e3d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2e3e0 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2e3f0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2e400 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2e410 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2e420 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2e430 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2e440 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2e450 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2e460 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2e470 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2e480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e490 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2e4a0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2e4b0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2e4c0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2e4d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e4e0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2e4f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64   || pPager->read
2e500 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28  Only );..    if(
2e510 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2e520 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
2e530 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2e540 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2e550 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2e560 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e590 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2e5a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2e5b0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2e5c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2e5d0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2e5e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e5f0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2e600 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2e610 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2e620 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2e630 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2e640 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2e650 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2e660 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2e670 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2e680 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2e690 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2e6a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2e6b0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2e6c0 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2e6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e6e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e6f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2e700 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2e710 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2e720 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
2e730 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2e740 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e750 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
2e760 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
2e770 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
2e780 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2e790 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
2e7a0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
2e7b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
2e7c0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2e7d0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
2e7e0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
2e7f0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
2e800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e810 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
2e820 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
2e830 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
2e840 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2e850 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
2e860 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
2e870 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
2e880 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
2e890 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
2e8a0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
2e8b0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
2e8c0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2e8d0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2e8e0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
2e8f0 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
2e900 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
2e910 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
2e920 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2e930 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
2e940 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
2e950 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
2e960 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
2e970 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
2e980 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
2e990 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
2e9a0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
2e9b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
2e9c0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
2e9d0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2e9e0 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
2e9f0 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
2ea00 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
2ea10 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
2ea20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2ea30 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
2ea40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2ea50 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
2ea60 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
2ea70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2ea80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ea90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
2eaa0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2eab0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
2eac0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2ead0 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
2eae0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
2eaf0 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
2eb00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
2eb10 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2eb20 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
2eb30 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
2eb40 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
2eb50 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2eb60 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
2eb70 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2eb80 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
2eb90 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
2eba0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
2ebb0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
2ebc0 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
2ebd0 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
2ebe0 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
2ebf0 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
2ec00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
2ec10 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
2ec20 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
2ec30 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
2ec40 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
2ec50 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
2ec60 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
2ec70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2ec80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
2ec90 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
2eca0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
2ecb0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
2ecc0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2ecd0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
2ece0 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
2ecf0 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
2ed00 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
2ed10 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
2ed20 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2ed30 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
2ed40 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
2ed50 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
2ed60 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
2ed70 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
2ed80 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
2ed90 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2eda0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2edb0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2edc0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2edd0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2ede0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2edf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ee00 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2ee10 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2ee20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
2ee30 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
2ee40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2ee50 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2ee60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
2ee70 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2ee80 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
2ee90 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2eea0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2eeb0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
2eec0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
2eed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2eee0 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
2eef0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2ef00 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2ef10 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2ef20 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2ef30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ef40 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2ef50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2ef60 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2ef70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ef80 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2ef90 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2efa0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2efb0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
2efc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2efd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2efe0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2eff0 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
2f000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f010 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
2f020 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f040 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2f050 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
2f060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2f070 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2f080 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
2f090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f0a0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
2f0b0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
2f0c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
2f0d0 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
2f0e0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
2f0f0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
2f100 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
2f110 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
2f120 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
2f130 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
2f140 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
2f150 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
2f160 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
2f170 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
2f180 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
2f190 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
2f1a0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2f1b0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
2f1c0 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
2f1d0 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
2f1e0 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
2f1f0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
2f200 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
2f210 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
2f220 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
2f230 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
2f240 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
2f250 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
2f260 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
2f270 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
2f280 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f290 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
2f2a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2f2b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2f2c0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
2f2d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2f2e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2f2f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f300 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2f310 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2f320 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
2f330 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2f340 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
2f350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f360 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
2f370 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f380 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
2f390 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2f3a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2f3b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2f3c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f3d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2f3e0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2f3f0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
2f400 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2f410 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
2f420 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
2f430 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
2f440 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
2f450 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2f460 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2f470 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2f480 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
2f490 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
2f4a0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
2f4b0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
2f4c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
2f4d0 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
2f4e0 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
2f4f0 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
2f500 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
2f510 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
2f520 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
2f530 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
2f540 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
2f550 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
2f560 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
2f570 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
2f580 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2f590 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
2f5a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
2f5b0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
2f5c0 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
2f5d0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
2f5e0 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
2f5f0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
2f600 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
2f610 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
2f620 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
2f630 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
2f640 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
2f650 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
2f660 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
2f670 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2f680 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
2f690 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
2f6a0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
2f6b0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
2f6c0 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
2f6d0 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
2f6e0 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
2f6f0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
2f700 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
2f710 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
2f720 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
2f730 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
2f740 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
2f750 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
2f760 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
2f770 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
2f780 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
2f790 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
2f7a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
2f7b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2f7c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
2f7d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2f7e0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2f7f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2f800 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2f810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2f820 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
2f830 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2f840 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
2f850 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f860 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
2f870 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
2f880 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
2f890 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
2f8a0 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26  empFile .     &&
2f8b0 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   (pPager->pBacku
2f8c0 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
2f8d0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2f8e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20  er->pPCache)>0) 
2f8f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2f900 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
2f910 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
2f920 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
2f930 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
2f940 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
2f950 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
2f960 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
2f970 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
2f980 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
2f990 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2f9a0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
2f9b0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
2f9c0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
2f9d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
2f9e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2f9f0 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
2fa00 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
2fa10 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
2fa20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
2fa30 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
2fa40 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
2fa50 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
2fa60 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
2fa70 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
2fa80 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
2fa90 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
2faa0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
2fab0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
2fac0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
2fad0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
2fae0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
2faf0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
2fb00 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
2fb10 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
2fb20 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
2fb30 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
2fb40 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
2fb50 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2fb60 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
2fb70 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
2fb80 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
2fb90 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
2fba0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
2fbb0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
2fbc0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
2fbd0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
2fbe0 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
2fbf0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
2fc00 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
2fc10 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2fc20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
2fc30 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
2fc40 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2fc50 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
2fc60 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2fc70 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2fc80 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2fc90 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
2fca0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
2fcb0 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
2fcc0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
2fcd0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2fce0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
2fcf0 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
2fd00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2fd10 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
2fd20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
2fd30 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
2fd40 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
2fd50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fd60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2fd70 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2fd80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2fd90 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2fda0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
2fdb0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2fdc0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
2fdd0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
2fde0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2fdf0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
2fe00 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
2fe10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2fe20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
2fe30 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2fe40 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2fe50 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
2fe60 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
2fe70 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
2fe80 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
2fe90 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
2fea0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
2feb0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
2fec0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2fed0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2fee0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
2fef0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
2ff00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ff10 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
2ff20 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
2ff30 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2ff40 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
2ff50 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
2ff60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2ff70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2ff80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2ff90 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
2ffa0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
2ffb0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2ffc0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
2ffd0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
2ffe0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2fff0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
30000 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
30010 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
30020 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
30030 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
30040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
30050 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
30060 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
30070 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
30080 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30090 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
300a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
300b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
300c0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
300d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
300e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
300f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
30100 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
30110 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
30120 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
30130 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
30140 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
30150 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
30160 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
30170 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
30180 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
30190 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
301a0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
301b0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
301c0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
301d0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
301e0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
301f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
30200 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
30210 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
30220 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
30230 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
30240 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
30250 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
30260 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
30270 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
30280 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
30290 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
302a0 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
302b0 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
302c0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
302d0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
302e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
302f0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
30300 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
30310 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
30320 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
30330 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
30340 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
30350 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
30360 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
30370 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
30380 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
30390 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
303a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
303b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
303c0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
303d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
303e0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
303f0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
30400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30410 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
30420 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
30430 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
30440 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
30450 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
30460 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
30470 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
30480 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
30490 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
304a0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
304b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
304c0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
304d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
304e0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
304f0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
30500 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
30510 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
30520 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
30530 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
30540 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
30550 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
30560 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
30570 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
30580 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
30590 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
305a0 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
305b0 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
305c0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
305d0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
305e0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
305f0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
30600 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
30610 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
30620 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
30630 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
30640 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
30650 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
30660 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
30670 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
30680 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
30690 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
306a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
306b0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
306c0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
306d0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
306e0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
306f0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
30700 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
30710 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
30720 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
30730 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
30740 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
30750 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
30760 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
30770 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
30780 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
30790 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
307a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
307b0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
307c0 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
307d0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
307e0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
307f0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
30800 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
30810 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
30820 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
30830 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
30840 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
30850 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
30860 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
30870 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
30880 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
30890 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
308a0 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
308b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
308c0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
308d0 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
308e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
308f0 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
30900 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
30910 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
30920 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
30930 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
30940 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
30950 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
30960 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
30970 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
30980 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
30990 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
309a0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
309b0 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
309c0 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
309d0 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
309e0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
309f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
30a00 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
30a10 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
30a20 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
30a30 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
30a40 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
30a50 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
30a60 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
30a70 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
30a80 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
30a90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
30aa0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
30ab0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
30ac0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
30ad0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
30ae0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
30af0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
30b00 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
30b10 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
30b20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
30b30 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
30b40 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
30b50 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
30b60 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
30b70 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
30b80 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
30b90 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
30ba0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
30bb0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
30bc0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
30bd0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
30be0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
30bf0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
30c00 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
30c10 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
30c20 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
30c30 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
30c40 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
30c50 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
30c60 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
30c70 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
30c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
30c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
30ca0 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
30cb0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
30cc0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
30cd0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
30ce0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
30cf0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
30d00 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
30d10 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
30d20 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
30d30 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
30d40 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
30d50 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
30d60 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
30d70 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
30d80 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
30d90 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
30da0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30db0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
30dc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30dd0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
30de0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
30df0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30e00 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30e10 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
30e20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
30e30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
30e40 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
30e50 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
30e60 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
30e70 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
30e80 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
30e90 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
30ea0 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
30eb0 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
30ec0 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
30ed0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
30ee0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
30ef0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
30f00 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
30f10 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
30f20 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
30f30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
30f40 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
30f50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
30f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30f70 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
30f80 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
30f90 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
30fa0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
30fb0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
30fc0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
30fd0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
30fe0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
30ff0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
31000 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
31010 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
31020 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
31030 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
31040 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
31050 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
31060 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
31070 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
31080 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
31090 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
310a0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
310b0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
310c0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
310d0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
310e0 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
310f0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
31100 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
31110 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
31120 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
31130 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
31140 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
31150 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
31160 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
31170 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
31180 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
31190 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
311a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
311b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74      pPager->nHit
311c0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
311d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
311e0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
311f0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
31200 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
31210 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
31220 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
31230 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
31240 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
31250 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
31260 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
31270 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
31280 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
31290 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
312a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
312b0 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
312c0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
312d0 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
312e0 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
312f0 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
31300 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
31310 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
31320 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
31330 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
31340 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
31350 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
31360 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
31370 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
31380 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
31390 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
313a0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
313b0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
313c0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
313d0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
313e0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
313f0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
31400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
31410 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
31420 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
31430 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
31440 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
31450 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
31460 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
31470 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
31480 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
31490 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
314a0 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
314b0 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
314c0 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
314d0 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
314e0 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
314f0 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
31500 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
31510 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
31520 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
31530 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
31540 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
31550 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
31560 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
31570 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
31580 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
31590 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
315a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
315b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
315c0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
315d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
315e0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
315f0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
31600 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
31610 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
31620 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
31630 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
31640 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31650 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
31660 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
31670 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
31680 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
31690 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
316a0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
316b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
316c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
316d0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
316e0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
316f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
31700 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
31710 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
31720 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
31730 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
31740 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
31750 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
31760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
31770 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
31780 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
31790 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73      pPager->nMis
317a0 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s++;.      rc = 
317b0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
317c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
317d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
317e0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
317f0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
31800 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
31810 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
31820 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
31830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31840 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
31850 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
31860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
31870 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
31880 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
31890 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
318a0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
318b0 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70  d(pPager);..  *p
318c0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
318d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
318e0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
318f0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
31900 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
31910 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
31920 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
31930 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
31940 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
31950 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
31960 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
31970 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
31980 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
31990 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
319a0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
319b0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
319c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
319d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
319e0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
319f0 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
31a00 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
31a10 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
31a20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
31a30 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
31a40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
31a50 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
31a60 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
31a70 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
31a80 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
31a90 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
31aa0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
31ab0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
31ac0 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
31ad0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
31ae0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
31af0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
31b00 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
31b10 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
31b20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31b30 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
31b40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31b50 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
31b60 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
31b70 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
31b80 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69  _ERROR );.  sqli
31b90 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
31ba0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
31bb0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
31bc0 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
31bd0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
31be0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
31bf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
31c00 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
31c10 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
31c20 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
31c30 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
31c40 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
31c50 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
31c60 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
31c70 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
31c80 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
31c90 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
31ca0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
31cb0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
31cc0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
31cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
31ce0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
31cf0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
31d00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
31d10 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
31d20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
31d30 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
31d40 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
31d50 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
31d60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
31d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
31d80 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
31d90 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
31da0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
31db0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
31dc0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
31dd0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
31de0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31df0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
31e00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
31e10 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
31e20 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
31e30 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
31e40 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
31e50 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
31e60 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
31e70 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
31e80 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
31e90 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
31ea0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
31eb0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
31ec0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
31ed0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
31ee0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
31ef0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
31f00 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
31f10 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
31f20 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
31f30 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
31f40 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
31f50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
31f60 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
31f70 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
31f80 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
31f90 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
31fa0 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
31fb0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
31fc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
31fd0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
31fe0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
31ff0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
32000 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
32010 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
32020 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
32030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
32040 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
32050 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
32060 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
32070 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
32080 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
32090 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
320a0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
320b0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
320c0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
320d0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
320e0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
320f0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
32100 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
32110 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
32120 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
32130 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
32140 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
32150 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
32160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
32170 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
32180 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32190 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
321a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
321b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
321c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
321d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
321e0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
321f0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
32200 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
32210 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
32220 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32230 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32240 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
32250 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
32260 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
32270 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
32280 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
32290 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
322a0 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
322b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
322c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
322d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
322e0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
322f0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
32300 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
32310 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
32320 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
32330 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
32340 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
32350 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
32360 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
32370 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
32380 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
32390 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
323a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
323b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
323c0 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
323d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
323e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
323f0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
32400 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
32410 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
32420 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
32430 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
32440 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
32450 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
32460 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
32470 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
32480 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
32490 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
324a0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
324b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
324c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
324d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
324e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
324f0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
32500 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
32510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32520 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
32530 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
32540 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
32550 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
32560 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
32570 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
32580 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
32590 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
325a0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
325b0 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
325c0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
325d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
325e0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
325f0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
32600 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
32610 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
32620 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
32630 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  );.  #ifdef SQLI
32640 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
32650 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 72  _WRITE.        r
32660 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
32670 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
32680 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
32690 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
326a0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
326b0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
326c0 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 29  Pager).        )
326d0 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20  ;.  #else.      
326e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
326f0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
32700 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
32710 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
32720 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
32730 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
32740 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
32750 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
32760 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
32770 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
32780 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
32790 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
327a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
327b0 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
327c0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
327d0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
327e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
327f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32800 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
32810 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
32820 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
32830 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
32840 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
32850 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
32860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
32870 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
32880 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
32890 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
328a0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
328b0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
328c0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
328d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
328e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
328f0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
32900 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
32910 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32920 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
32930 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
32940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
32950 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32960 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
32970 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
32980 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
32990 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
329a0 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
329b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
329c0 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
329d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
329e0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
329f0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
32a00 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
32a10 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
32a20 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
32a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32a40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
32a50 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
32a60 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
32a70 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
32a80 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
32a90 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
32aa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
32ab0 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
32ac0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
32ad0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
32ae0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
32af0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
32b00 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
32b10 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
32b20 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
32b30 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
32b40 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
32b50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
32b60 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
32b70 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
32b80 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
32b90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
32ba0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
32bb0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
32bc0 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
32bd0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
32be0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
32bf0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
32c00 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
32c10 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
32c20 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
32c30 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
32c40 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
32c50 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
32c60 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
32c70 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
32c80 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
32c90 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
32ca0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
32cb0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
32cc0 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
32cd0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
32ce0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
32cf0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
32d00 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
32d10 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
32d20 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
32d30 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
32d40 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
32d50 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
32d60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32d70 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
32d80 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
32d90 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
32da0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
32db0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
32dc0 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
32dd0 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
32de0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
32df0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
32e00 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
32e10 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
32e20 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
32e30 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
32e40 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
32e50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
32e60 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
32e70 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
32e80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
32e90 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
32ea0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
32eb0 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
32ec0 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
32ed0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
32ee0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
32ef0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
32f00 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
32f10 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
32f20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32f30 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
32f40 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
32f50 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
32f60 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
32f70 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
32f80 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
32f90 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
32fa0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
32fb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
32fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
32ff0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
33000 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
33010 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
33020 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
33030 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
33040 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
33050 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
33060 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
33070 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
33080 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
33090 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
330a0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
330b0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
330c0 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
330d0 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
330e0 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
330f0 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
33100 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
33110 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
33120 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
33130 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
33140 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
33150 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
33160 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
33170 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
33180 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
33190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
331a0 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
331b0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
331c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
331d0 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
331e0 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
331f0 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
33200 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
33210 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
33220 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
33230 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
33240 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
33250 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
33260 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
33270 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
33280 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
33290 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
332a0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
332b0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
332c0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
332d0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
332e0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
332f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33300 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
33310 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
33320 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
33330 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
33340 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
33350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33370 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
33380 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
33390 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
333a0 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
333b0 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
333c0 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
333d0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
333e0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
333f0 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
33400 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
33410 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
33420 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
33430 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
33440 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
33450 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
33460 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
33470 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
33480 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
33490 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
334a0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
334b0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
334c0 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
334d0 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
334e0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
334f0 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
33500 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
33510 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
33520 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
33530 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
33540 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
33550 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
33560 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
33570 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
33580 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
33590 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
335a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
335b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
335c0 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
335d0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
335e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
335f0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
33600 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
33610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
33620 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33630 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
33640 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
33650 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
33660 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33670 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
33680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
33690 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
336a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
336b0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
336c0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
336d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
336e0 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
336f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
33700 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
33710 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
33720 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
33730 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
33740 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
33750 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
33760 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
33770 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
33780 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
33790 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
337a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
337b0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
337c0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
337d0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
337e0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
337f0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
33800 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
33810 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
33820 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
33830 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
33840 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
33850 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
33860 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
33870 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
33880 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
33890 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
338a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
338b0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
338c0 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
338d0 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74  unless a write-t
338e0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
338f0 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65  lready .  ** bee
33900 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a  n started. The j
33910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
33920 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
33930 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
33940 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76  ..  ** It is nev
33950 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  er called in the
33960 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20   ERROR state..  
33970 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
33980 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33990 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
339a0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
339b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
339c0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
339d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
339e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
339f0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
33a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33a10 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33a20 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
33a30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
33a40 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
33a50 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72   detected, repor
33a60 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  t the same error
33a70 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69  .  ** again. Thi
33a80 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70  s should not hap
33a90 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65  pen, but the che
33aa0 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75  ck provides robu
33ab0 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
33ac0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
33ad0 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
33ae0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
33af0 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
33b00 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
33b10 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
33b20 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
33b30 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
33b40 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
33b50 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
33b60 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
33b70 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
33b80 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
33b90 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
33ba0 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43  TE_PERM;..  CHEC
33bb0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
33bc0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
33bd0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
33be0 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c  opened. Higher l
33bf0 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61  evel routines ha
33c00 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
33c10 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63  obtained the nec
33c20 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20  essary locks to 
33c30 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d  begin the write-
33c40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
33c50 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61   the.  ** rollba
33c60 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ck journal might
33c70 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
33c80 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66  . Open it now if
33c90 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
33ca0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
33cb0 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
33cc0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
33cd0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
33ce0 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  ) on the page. .
33cf0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33d00 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20  if it were done 
33d10 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71  after calling sq
33d20 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
33d30 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a  irty(), then.  *
33d40 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74  * an error might
33d50 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70   occur and the p
33d60 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75  ager would end u
33d70 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  p in WRITER_LOCK
33d80 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69  ED state.  ** wi
33d90 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20  th pages marked 
33da0 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20  as dirty in the 
33db0 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
33dc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33dd0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
33de0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20  OCKED ){.    rc 
33df0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
33e00 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
33e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33e20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
33e30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
33e40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
33e50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
33e60 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  EMOD );.  assert
33e70 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
33e80 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
33e90 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
33ea0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
33eb0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
33ec0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
33ed0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
33ee0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
33ef0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
33f00 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
33f10 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
33f20 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
33f30 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
33f40 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
33f50 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
33f60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
33f70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33f80 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) );.  }else{.  
33f90 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
33fa0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
33fb0 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
33fc0 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
33fd0 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
33fe0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
33ff0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
34000 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
34010 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
34020 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
34030 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
34040 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
34050 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
34060 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
34070 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
34080 29 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  ) && !pagerUseWa
34090 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
340a0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
340b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
340c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
340d0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
340e0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20  ->dbOrigSize && 
340f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
34100 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  fd) ){.        u
34110 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
34120 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
34130 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
34140 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
34150 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20  alOff;..        
34160 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
34170 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
34180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
34190 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
341a0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
341b0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
341c0 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
341d0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
341e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
341f0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
34200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34210 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
34220 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
34230 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
34240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
34250 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d  rnalHdr<=pPager-
34260 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
34270 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
34280 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
34290 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
342a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
342b0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
342c0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
342d0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
342e0 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20  *)pData2);..    
342f0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
34300 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
34310 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
34320 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
34330 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
34340 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
34350 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
34360 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
34370 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
34380 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
34390 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
343a0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
343b0 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
343c0 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
343d0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
343e0 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
343f0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
34400 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
34410 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
34420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34430 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
34440 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
34450 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
34460 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
34470 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
34480 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
34490 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
344a0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
344b0 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72  SYNC;..        r
344c0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
344d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
344e0 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
344f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34500 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
34510 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
34520 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
34530 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
34540 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
34550 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29  ageSize, iOff+4)
34560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
34580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
34590 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
345a0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
345b0 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  Off+pPager->page
345c0 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a  Size+4, cksum);.
345d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
345e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
345f0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
34600 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
34610 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
34620 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
34630 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
34640 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
34650 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
34660 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
34670 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
34680 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
34690 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
346a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
346b0 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
346c0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
346d0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
346e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
346f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
34700 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
34710 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
34720 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
34730 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
34740 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
34750 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67  );..        pPag
34760 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
34770 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  = 8 + pPager->pa
34780 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
34790 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
347a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
347b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
347c0 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
347d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
347e0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
347f0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
34800 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
34810 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34820 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34830 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
34840 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
34850 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
34860 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
34870 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
34880 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
34890 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
348a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
348b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
348c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
348d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
348e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
348f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
34920 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
34930 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
34940 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
34950 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
34960 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NC;.        }.  
34970 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
34980 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
34990 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
349a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
349b0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
349c0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
349d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
349e0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
349f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
34a00 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
34a10 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
34a20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34a30 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
34a40 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
34a50 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
34a60 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
34a70 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
34a80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
34a90 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
34aa0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
34ab0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
34ac0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
34ad0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
34ae0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
34af0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
34b00 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
34b10 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
34b20 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
34b30 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
34b40 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
34b50 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
34b60 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
34b70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
34b80 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
34b90 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
34ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
34bb0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
34bc0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
34bd0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
34be0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
34bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34c00 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
34c10 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
34c20 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
34c30 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
34c40 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
34c50 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
34c60 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
34c70 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
34c80 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
34c90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
34ca0 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
34cb0 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
34cc0 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
34cd0 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
34ce0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
34cf0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
34d00 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
34d10 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34d20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
34d30 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
34d40 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
34d50 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
34d60 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
34d70 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
34d80 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
34d90 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
34da0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
34db0 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
34dc0 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
34dd0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
34de0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
34df0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
34e00 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
34e10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
34e20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
34e30 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
34e40 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
34e50 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
34e60 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
34e70 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
34e80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
34e90 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
34ea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34eb0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
34ec0 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
34ed0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
34ee0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
34ef0 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
34f00 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
34f10 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
34f20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
34f30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34f40 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
34f50 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
34f60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34f70 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
34f80 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
34f90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
34fa0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
34fb0 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
34fc0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
34fd0 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
34fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
34ff0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
35000 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
35010 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
35020 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
35030 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
35040 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
35050 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
35060 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
35070 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  age = 0;        
35080 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35090 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
350a0 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
350b0 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
350e0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  er */.    int ne
350f0 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20  edSync = 0;     
35100 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
35110 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
35120 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a  R_NEED_SYNC */..
35130 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
35140 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c  oNotSyncSpill fl
35150 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
35160 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
35170 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20  ot allow.    ** 
35180 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35190 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
351a0 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
351b0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20   journaled by.  
351c0 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
351d0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
351e0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
351f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35200 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
35210 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
35220 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
35230 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  pill++;..    /* 
35240 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
35250 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
35260 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
35270 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
35280 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
35290 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
352a0 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
352b0 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
352c0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
352d0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
352e0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
352f0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
35300 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
35310 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
35320 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
35330 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
35340 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67  PageCount = pPag
35350 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
35360 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
35370 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
35380 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
35390 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
353a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
353b0 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
353c0 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
353d0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
353e0 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
353f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35400 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
35410 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
35420 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
35430 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
35440 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
35450 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
35460 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
35470 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
35480 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
35490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
354a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
354b0 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
354c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
354d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
354e0 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
354f0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
35500 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35510 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
35520 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
35530 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
35540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
35550 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35560 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
35570 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
355a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
355b0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
355c0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
355d0 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
355e0 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
355f0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
35600 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
35610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35620 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35630 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
35640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35650 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
35660 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
35670 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
35680 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
35690 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
356a0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
356b0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
356c0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
356d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
356e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
356f0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
35700 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
35710 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
35720 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
35730 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
35740 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
35750 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
35760 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
35770 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
35780 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
35790 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
357a0 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
357b0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
357c0 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
357d0 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
357e0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
357f0 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
35800 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
35810 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
35820 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
35830 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
35840 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
35850 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35880 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  & needSync ){.  
35890 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
358a0 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  DB );.      for(
358b0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20  ii=0; ii<nPage; 
358c0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
358d0 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
358e0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
358f0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
35900 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
35910 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
35920 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
35930 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
35940 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
35950 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
35960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35970 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
35980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
35990 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29  otSyncSpill==1 )
359a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
359b0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a  NotSyncSpill--;.
359c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
359d0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
359e0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
359f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35a00 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
35a10 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
35a20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
35a30 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
35a40 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
35a50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
35a60 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
35a70 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
35a80 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
35a90 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
35aa0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
35ab0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
35ac0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
35ad0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
35ae0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
35af0 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
35b00 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
35b10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
35b20 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
35b30 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
35b40 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
35b50 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
35b60 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
35b70 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
35b80 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
35b90 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
35ba0 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
35bb0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
35bc0 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
35bd0 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
35be0 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
35bf0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
35c00 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
35c10 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
35c20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
35c30 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
35c40 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
35c50 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
35c60 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
35c70 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
35c80 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
35c90 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
35ca0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
35cb0 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
35cc0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
35cd0 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
35ce0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
35cf0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
35d00 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
35d10 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
35d20 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
35d30 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
35d40 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
35d50 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
35d60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35d70 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
35d80 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
35d90 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
35da0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
35db0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
35dc0 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
35dd0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
35de0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
35df0 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
35e00 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
35e10 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
35e20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
35e30 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
35e40 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
35e50 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
35e60 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
35e70 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
35e80 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61 67  T_WRITE;.    pag
35e90 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
35ea0 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pPg);.  }.}../*.
35eb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
35ec0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
35ed0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
35ee0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
35ef0 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
35f00 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
35f10 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
35f20 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
35f30 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
35f40 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
35f50 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
35f60 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72 79  .  The secondary
35f70 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
35f80 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f  at.** 92 is also
35f90 20 75 70 64 61 74 65 64 2c 20 61 73 20 69 73 20   updated, as is 
35fa0 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
35fb0 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66  on number at off
35fc0 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75  set 96..**.** Bu
35fd0 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  t this only happ
35fe0 65 6e 73 20 69 66 20 74 68 65 20 70 50 61 67 65  ens if the pPage
35ff0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
36000 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65  ne flag is false
36010 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65 78  ..** To avoid ex
36020 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20 6f 66  cess churning of
36030 20 70 61 67 65 20 31 2c 20 74 68 65 20 75 70 64   page 1, the upd
36040 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  ate only happens
36050 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61 6c   once..** See al
36060 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77 72 69  so the pager_wri
36070 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
36080 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  () routine that 
36090 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f  does an .** unco
360a0 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
360b0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63   of the change c
360c0 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  ounters..**.** I
360d0 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  f the isDirectMo
360e0 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  de flag is zero,
360f0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
36100 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
36110 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
36120 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
36130 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
36140 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36150 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
36160 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
36170 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
36180 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
36190 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
361a0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
361b0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
361c0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
361d0 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
361e0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
361f0 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
36200 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
36210 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
36220 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
36230 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
36240 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
36250 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
36260 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
36270 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
36280 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
36290 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
362a0 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
362b0 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
362c0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
362d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
362e0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
362f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
36300 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
36310 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
36320 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
36330 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
36340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
36350 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36360 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36370 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
36380 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
36390 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
363a0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
363b0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
363c0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
363d0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c  r) );..  /* Decl
363e0 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  are and initiali
363f0 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65  ze constant inte
36400 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20  ger 'isDirect'. 
36410 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d  If the.  ** atom
36420 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
36430 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
36440 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
36450 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20  then isDirect.  
36460 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ** is initialize
36470 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  d to the value p
36480 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44  assed as the isD
36490 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65  irectMode parame
364a0 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ter.  ** to this
364b0 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
364c0 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61  wise, it is alwa
364d0 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
364e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64    **.  ** The id
364f0 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68  ea is that if th
36500 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
36510 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
36520 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20  ot.  ** enabled 
36530 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
36540 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61   the compiler ca
36550 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73  n omit the tests
36560 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65   of.  ** 'isDire
36570 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65  ct' below, as we
36580 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20  ll as the block 
36590 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a  enclosed in the.
365a0 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65    ** "if( isDire
365b0 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e  ct )" condition.
365c0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
365d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
365e0 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e  IC_WRITE.# defin
365f0 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a  e DIRECT_MODE 0.
36600 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
36610 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
36620 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36630 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
36640 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49  else.# define DI
36650 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65  RECT_MODE isDire
36660 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20  ctMode.#endif.. 
36670 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
36680 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
36690 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
366a0 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
366b0 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20  pPgHdr;         
366c0 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65         /* Refere
366d0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
366e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
366f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
36700 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
36710 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
36720 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
36730 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
36740 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
36750 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
36760 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
36770 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
36780 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
36790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
367a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
367b0 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
367c0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
367d0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
367e0 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
367f0 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
36800 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
36810 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
36820 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
36830 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
36840 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
36850 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
36860 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
36870 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
36880 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
36890 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
368a0 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
368b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
368c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
368d0 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
368e0 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
368f0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
36900 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36910 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
36920 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
36930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36940 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 6c 79 20      /* Actually 
36950 64 6f 20 74 68 65 20 75 70 64 61 74 65 20 6f 66  do the update of
36960 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
36970 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 61 67  ter */.      pag
36980 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
36990 6f 75 6e 74 65 72 28 70 50 67 48 64 72 29 3b 0a  ounter(pPgHdr);.
369a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
369b0 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
369c0 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
369d0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
369e0 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
369f0 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52 45  /.      if( DIRE
36a00 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20  CT_MODE ){.     
36a10 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
36a20 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Buf;.        ass
36a30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46  ert( pPager->dbF
36a40 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20  ileSize>0 );.   
36a50 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
36a60 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61 74  er, pPgHdr->pDat
36a70 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49  a, 1, 6, rc=SQLI
36a80 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b  TE_NOMEM, zBuf);
36a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
36aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36ab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36ac0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
36ad0 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
36ae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
36af0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
36b00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36b20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
36b30 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
36b40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36b60 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
36b70 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
36b80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
36b90 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
36ba0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
36bb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
36bc0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
36bd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
36be0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
36bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36c00 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73  le to disk. This
36c10 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
36c20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
36c30 73 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  ses.** or pages 
36c40 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
36c50 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
36c60 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
36c70 66 75 6c 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65  ful, or if calle
36c80 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72  d on a pager for
36c90 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e   which it is a n
36ca0 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75  o-op, this.** fu
36cb0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
36cc0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
36cd0 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  ise, an IO error
36ce0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
36cf0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
36d00 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
36d10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
36d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36d30 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
36d40 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
36d50 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
36d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36d70 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
36d80 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
36d90 6c 61 67 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69  lags);.  }else i
36da0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
36db0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
36dc0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
36dd0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
36de0 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
36df0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
36e00 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 2c 20 28  _SYNC_OMITTED, (
36e10 76 6f 69 64 20 2a 29 26 72 63 29 3b 0a 20 20 7d  void *)&rc);.  }
36e20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36e30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
36e40 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
36e50 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20   called while a 
36e60 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36e70 6e 20 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a  n is active in.*
36e80 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74  * rollback. If t
36e90 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
36ea0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68   in WAL mode, th
36eb0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
36ec0 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  op. .** Otherwis
36ed0 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  e, if the connec
36ee0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c  tion does not al
36ef0 72 65 61 64 79 20 68 61 76 65 20 61 6e 20 45 58  ready have an EX
36f00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
36f10 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
36f20 20 66 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70   file, an attemp
36f30 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
36f40 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  ain one..**.** I
36f50 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
36f60 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
36f70 68 65 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65  held or the atte
36f80 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  mpt to obtain it
36f90 20 69 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   is.** successfu
36fa0 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63  l, or the connec
36fb0 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d  tion is in WAL m
36fc0 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ode, SQLITE_OK i
36fd0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
36fe0 74 68 65 72 77 69 73 65 2c 20 65 69 74 68 65 72  therwise, either
36ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
37000 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
37010 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
37020 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
37030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37040 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
37050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
37060 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37070 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
37080 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37090 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
370a0 43 48 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c  CHEMOD .       |
370b0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
370c0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
370d0 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  BMOD .       || 
370e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
370f0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37100 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  KED .  );.  asse
37110 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37120 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37130 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61 67 65 72  ;.  if( 0==pager
37140 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
37150 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
37160 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
37170 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
37180 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LOCK);.  }.  ret
37190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
371a0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
371b0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
371c0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
371d0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
371e0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
371f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
37200 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
37210 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
37220 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
37230 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
37240 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
37250 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
37260 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
37270 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
37280 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
37290 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
372a0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
372b0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
372c0 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  hat:.**.**   * T
372d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
372e0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
372f0 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20  is updated,.**  
37300 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69   * the journal i
37310 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73  s synced (unless
37320 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
37330 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
37340 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20  s used),.**   * 
37350 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
37360 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  are written to t
37370 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37380 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  , .**   * the da
37390 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
373a0 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71  runcated (if req
373b0 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20  uired), and.**  
373c0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
373d0 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a  file synced. .**
373e0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
373f0 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20  ng that remains 
37400 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
37410 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
37420 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65  finalize .** (de
37430 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f  lete, truncate o
37440 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  r zero the first
37450 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f   part of) the jo
37460 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a  urnal file (or .
37470 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ** delete the ma
37480 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
37490 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
374a0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
374b0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
374c0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
374d0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
374e0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
374f0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
37500 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
37510 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
37520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
37530 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
37540 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
37550 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
37560 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
37570 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
37580 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
37590 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
375a0 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
375b0 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
375c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
375d0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
375e0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
375f0 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
37600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
37610 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
37620 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
37630 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
37640 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
37650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37660 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
37670 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
37680 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20  zMaster,        
37690 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
376a0 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  LL, the master j
376b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
376c0 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20   int noSync     
376d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
376f0 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68   the xSync on th
37700 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  e db file */.){.
37710 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37720 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
37730 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
37740 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
37750 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37760 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37770 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  ED.       || pPa
37780 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37790 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
377a0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
377b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
377c0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
377d0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
377e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
377f0 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73  ERROR.  );.  ass
37800 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37810 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37820 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72  );..  /* If a pr
37830 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ior error occurr
37840 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20  ed, report that 
37850 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a  error again. */.
37860 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
37870 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
37880 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
37890 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
378a0 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
378b0 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
378c0 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
378d0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
378e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
378f0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
37900 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a  >dbSize));..  /*
37910 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   If no database 
37920 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
37930 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65  n made, return e
37940 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arly. */.  if( p
37950 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
37960 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37970 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c  MOD ) return SQL
37980 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d  ITE_OK;..  if( M
37990 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49  EMDB ){.    /* I
379a0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
379b0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
379c0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
379d0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
379e0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63  this.    ** func
379f0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37a00 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
37a10 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d   is mostly a no-
37a20 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e  op.  However, an
37a30 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20  y.    ** backup 
37a40 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64  in progress need
37a50 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74 65  s to be restarte
37a60 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
37a70 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
37a80 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
37a90 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  up);.  }else{.  
37aa0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
37ab0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
37ac0 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
37ad0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
37ae0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
37af0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
37b00 20 50 67 48 64 72 20 2a 70 50 61 67 65 4f 6e 65   PgHdr *pPageOne
37b10 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
37b20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
37b30 20 20 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65      /* Must have
37b40 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
37b50 67 65 20 66 6f 72 20 74 68 65 20 57 41 4c 20 63  ge for the WAL c
37b60 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a 20 20 20 20  ommit flag..    
37b70 20 20 20 20 2a 2a 20 54 69 63 6b 65 74 20 5b 32      ** Ticket [2
37b80 64 31 61 35 63 36 37 64 66 63 32 33 36 33 65 34  d1a5c67dfc2363e4
37b90 34 66 32 39 64 39 62 62 64 35 37 66 5d 20 32 30  4f29d9bbd57f] 20
37ba0 31 31 2d 30 35 2d 31 38 20 2a 2f 0a 20 20 20 20  11-05-18 */.    
37bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37bc0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
37bd0 20 31 2c 20 26 70 50 61 67 65 4f 6e 65 29 3b 0a   1, &pPageOne);.
37be0 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
37bf0 70 50 61 67 65 4f 6e 65 3b 0a 20 20 20 20 20 20  pPageOne;.      
37c00 20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20    pList->pDirty 
37c10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
37c20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
37c30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
37c40 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
37c50 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
37c60 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
37c70 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  es(pPager, pList
37c80 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
37c90 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 1, .          
37ca0 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53    (pPager->fullS
37cb0 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79  ync ? pPager->sy
37cc0 6e 63 46 6c 61 67 73 20 3a 20 30 29 0a 20 20 20  ncFlags : 0).   
37cd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
37ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37cf0 65 72 55 6e 72 65 66 28 70 50 61 67 65 4f 6e 65  erUnref(pPageOne
37d00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
37d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
37d30 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
37d40 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
37d50 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37d60 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
37d70 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
37d80 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
37d90 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
37da0 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a  y how it.      *
37db0 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65  * does this depe
37dc0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
37dd0 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
37de0 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
37df0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61  tion.      ** wa
37e00 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
37e10 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69  pile time, and i
37e20 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
37e30 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20  on meets the .  
37e40 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63      ** runtime c
37e50 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74  riteria to use t
37e60 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20  he operation: . 
37e70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
37e80 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73      * The file-s
37e90 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
37ea0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
37eb0 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
37ec0 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
37ed0 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
37ee0 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ize, and .      
37ef0 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
37f00 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
37f10 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
37f20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
37f30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  .      **    * E
37f40 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
37f50 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
37f60 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
37f70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
37f80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
37f90 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
37fa0 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65  zation was not e
37fb0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
37fc0 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65  e time, then the
37fd0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
37fe0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
37ff0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  er() function is
38000 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74   called to updat
38010 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20  e the change.   
38020 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
38030 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
38040 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
38050 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
38060 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a  d in but.      *
38070 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61  * is not applica
38080 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ble to this tran
38090 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71  saction, call sq
380a0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
380b0 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  te().      ** to
380c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   make sure the j
380d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
380e0 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72  actually been cr
380f0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c  eated, then call
38100 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
38110 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
38120 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
38130 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
38140 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
38150 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
38160 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
38170 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
38180 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
38190 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61  s both enabled a
381a0 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20  nd applicable,. 
381b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c       ** then cal
381c0 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  l pager_incr_cha
381d0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
381e0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
381f0 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  e-counter.      
38200 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
38210 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
38220 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
38230 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
38240 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65  .      ** create
38250 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
38260 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
38270 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
38280 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
38290 52 49 54 45 0a 20 20 20 20 20 20 50 67 48 64 72  RITE.      PgHdr
382a0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73   *pPg;.      ass
382b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
382c0 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  er->jfd) .      
382d0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
382e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
382f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
38300 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
38310 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
38320 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
38330 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
38340 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
38350 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f   !zMaster && isO
38360 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
38370 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
38380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
38390 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
383a0 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 26  Pager) .       &
383b0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
383c0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  >=pPager->dbOrig
383d0 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28  Size.       && (
383e0 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65  0==(pPg = sqlite
383f0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
38400 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
38410 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44  )) || 0==pPg->pD
38420 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20  irty).      ){. 
38430 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
38440 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61   the db file cha
38450 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20  nge counter via 
38460 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65  the direct-write
38470 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20   method. The .  
38480 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
38490 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
384a0 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ify the in-memor
384b0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
384c0 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20   of page 1 .    
384d0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64      ** to includ
384e0 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68  e the updated ch
384f0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64  ange counter and
38500 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65   then write page
38510 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64   1 .        ** d
38520 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
38530 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65  atabase file. Be
38540 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
38550 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20  mic-write .     
38560 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f     ** property o
38570 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
38580 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20  system, this is 
38590 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  safe..        */
385a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
385b0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
385c0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
385d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
385e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
385f0 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
38600 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
38610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
38620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38630 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
38640 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
38650 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
38660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38670 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20   }.  #else.     
38680 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
38690 5f 63 68